"Batch auto-increment" 用于多行插入的 ID

"Batch auto-increment" IDs for multiple row insertion

我在 SQL Server 2017 中工作,我有一个 table 的形式:

tbl_current

COL1   COL2
-----------
 A      1
 B      3
 C     56

我想定期插入 table tbl_release.

此 table 将有一个额外的 ID 列,我希望它随每个 "batch insertion" 自动递增。例如,假设我将 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 服务器功能可以实现此目的,或者我是否需要 运行 一些子查询?

您可以使用 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

如果您的 table 的 Id 列是同一列,那么您还可以使用 Scope_Identity 获取 Id 列的最大值。

我个人会为此使用一个序列。假设插入你的临时 table 已经完成,它看起来像这样:

declare @ID int = next value for sequence dbo.mySequence;

insert into tbl_release
   (ID, col1, col2)
select @ID, col1, col2
from tbl_current;

你的id真的是一个对象。我强烈建议你给它一个完整的 table:

create table batches (
    batch_id int identity(1, 1) primary key,
    batch_start_date datetime,
    . . . 
);

那么,您现有的 table 的结构应为:

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
);

这样,您的数据库就具有参照完整性。