IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #testCREATE TABLE #test(col_1 int identity(1, 1) PRIMARY KEY, col_2 int)INSERT INTO #test VALUES(56)INSERT INTO #test SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 DECLARE @maxindex INT,@indexNum INT,@s VARCHAR(1000) SELECT @maxindex=SCOPE_IDENTITY(),@indexNum=@@ROWCOUNT,@s='SELECT [IDENTITY]=' + RTRIM(@maxindex)WHILE @indexNum>0 SELECT @maxindex=@maxindex-1,@indexNum=@indexNum-1,@s=@s + ' UNION ALL SELECT ' + RTRIM(@maxindex) EXEC(@s)
如果有大量并发的情况建议使用邹建提供的使用触发器方法.例如 insert table select * from tbx where ...导致有数万行插入时,这个耗时过程中其它连接也可能向表中插入了行,这样可能会导致该连接中插入行的ID不连续,通过@@ROWCOUNT与最后一行的SCOPE_IDENTITY()之间的差值来计算的ID中可能会包含其它连接插入生成的ID. 邹建在那个帖子中的并发测试很有说服力.在并发情况下,使用触发器获得的ID没有丝毫的错误,完全是该连接内插入行的ID,可以看到并发情况下获得的ID的确是不连续的.
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
DECLARE @maxindex INT,@indexNum INT,@s VARCHAR(1000)
SELECT @maxindex=SCOPE_IDENTITY(),@indexNum=@@ROWCOUNT,@s='SELECT [IDENTITY]=' + RTRIM(@maxindex)WHILE @indexNum>0
SELECT @maxindex=@maxindex-1,@indexNum=@indexNum-1,@s=@s + ' UNION ALL SELECT ' + RTRIM(@maxindex)
EXEC(@s)
insert table select * from tbx where ...导致有数万行插入时,这个耗时过程中其它连接也可能向表中插入了行,这样可能会导致该连接中插入行的ID不连续,通过@@ROWCOUNT与最后一行的SCOPE_IDENTITY()之间的差值来计算的ID中可能会包含其它连接插入生成的ID.
邹建在那个帖子中的并发测试很有说服力.在并发情况下,使用触发器获得的ID没有丝毫的错误,完全是该连接内插入行的ID,可以看到并发情况下获得的ID的确是不连续的.