我有一张桌子,例如:
CREATE TABLE orders (
[id] [int] IDENTITY(1,1) NOT NULL,
[number] [int] NOT NULL,
[date] [datetime] NOT NULL
)
number
列也是唯一的,下一个数字由存储过程确定,获取当前数字+ 1并将其保存回公共numbers
表:
CREATE TABLE numbers (
[id] [int] IDENTITY(1,1) NOT NULL,
[tablename] [varchar](100) NOT NULL,
[currentnumber] [int] NOT NULL
)
插入单个记录时,上述系统工作正常。但是,现在我有一种情况,即我正在批量插入记录,每个插入的记录必须具有由存储过程确定的唯一编号。
目前,我设法让这个工作的唯一方法是使用一个光标获取下一个n
数字并将它们存储到一个表变量中,类似于:
declare @recordid int
declare @nextnumber int
declare cur CURSOR LOCAL for
select id from @records
open cur
fetch next from cur into @recordid
while @@FETCH_STATUS = 0 BEGIN
exec @nextnumber = get_nextnumber 'orders', @nextnumber output
insert into @numbers VALUES (@recordid, @id_nextnumber);
fetch next from cur into recordid
END
close cur
deallocate cur
之后,我将@numbers
表变量与@records
TVP一起加入,并将记录插入到实际表格中。
是否有更好更清洁的方法来完成上述操作但完全避免使用游标?
插入应该使用MERGE INTO
完成,因为我需要使用OUTPUT
来捕获一些列。