我正在使用SQL Server 2017,并且具有以下形式的表:
tbl_current
COL1 COL2
-----------
A 1
B 3
C 56
我想定期将其插入表tbl_release
中。
此表将有一个额外的ID列,我想随着每个“批处理插入”自动递增。例如,假设我执行了tbl_current
到tbl_release
的摄取,它看起来像这样:
tbl_release
ID COL1 COL2
----------------
1 A 1
1 B 3
1 C 56
现在,假设我使用相同的数据执行另一次提取,如下所示:
tbl_release
ID COL1 COL2
----------------
1 A 1
1 B 3
1 C 56
2 A 1
2 B 3
2 C 56
实现此目标的最佳方法是什么?是否有一些SQL Server功能可以实现此目的,还是我需要运行一些子查询?
答案 0 :(得分:4)
我个人会使用一个序列。假设已插入临时表,看起来像这样:
declare @ID int = next value for sequence dbo.mySequence;
insert into tbl_release
(ID, col1, col2)
select @ID, col1, col2
from tbl_current;
答案 1 :(得分:0)
您可以使用MAX()
函数尝试此操作,如下所示。
Declare @maxId int
set @maxId = (Select isnull(id, 0) from tbl_Current)
set @maxId = @maxId + 1
--Now to insert
insert into tbl_release values (@maxId, <Column1Value>, <Column2Value>)
对于多次插入,您可以尝试
INSERT INTO tbl_release
SELECT @maxId, col1, col2 FROM tbl_Current
如果表的ID列是标识,则还可以使用Scope_Identity获取ID列的最大值。
答案 2 :(得分:0)
您的create table batches (
batch_id int identity(1, 1) primary key,
batch_start_date datetime,
. . .
);
实际上是一个对象。我强烈建议您提供完整的表格:
create table releases (
release_id int identity(1, 1) primary key,
batch_id int not null references batches(batch_id),
col1 char(1),
col2 int
);
然后,您现有的表的结构应为:
<h1 mat-dialog-title>Where do you work?</h1>
<div mat-dialog-content>
<mat-form-field>
<input matInput placeholder="enter work location" autocorrect="off" autocapitalize="off" spellcheck="off" type="text" class="form-control" #search [formControl]="searchControl">
<agm-map id="capture-work-map" [latitude]="coordinates.lat" [longitude]="coordinates.lng" [zoom]="zoom">
<agm-marker [markerDraggable]="true" [latitude]="coordinates.lat" [longitude]="coordinates.lng"></agm-marker>
</agm-map>
</mat-form-field>
</div>
<div mat-dialog-actions>
<button mat-button (click)="onNoClick()">Cancel</button>
<button mat-button [mat-dialog-close]="coordinates" cdkFocusInitial>Update</button>
</div>
这样,您的数据库就具有参照完整性。