如何能获得多个自增长ID?

WZZ 2006-08-15 02:46:57

IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test

CREATE TABLE #test(col_1 int identity(1, 1) PRIMARY KEY, col_2 int)

INSERT INTO #test VALUES(56)
SELECT SCOPE_IDENTITY() -- 如果是单条记录的插入, 此处可获得当前的自增长ID


INSERT INTO #test
SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5

-- ? 如果是多条数据同时插入,请问,如何能一次同时,获得这些自增长ID ?

...全文
269 点赞 收藏 4
写回复
4 条回复
fcuandy 2006年08月15日
是的.这个取法无法区分是否当前连接生成的.
回复 点赞
hellowork 2006年08月15日
如果有大量并发的情况建议使用邹建提供的使用触发器方法.例如
insert table select * from tbx where ...导致有数万行插入时,这个耗时过程中其它连接也可能向表中插入了行,这样可能会导致该连接中插入行的ID不连续,通过@@ROWCOUNT与最后一行的SCOPE_IDENTITY()之间的差值来计算的ID中可能会包含其它连接插入生成的ID.
邹建在那个帖子中的并发测试很有说服力.在并发情况下,使用触发器获得的ID没有丝毫的错误,完全是该连接内插入行的ID,可以看到并发情况下获得的ID的确是不连续的.
回复 点赞
fcuandy 2006年08月15日
IF OBJECT_ID('tempdb..#test') IS NOT NULL DROP TABLE #test

CREATE 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)
回复 点赞
hellowork 2006年08月15日
请楼主参考一下下面的帖子中邹建给出的在SQLSERVER2000中的方案,要使用触发器:
http://community.csdn.net/Expert/topic/4868/4868036.xml?temp=.9568903
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9308

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告