如何能获得多个自增长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 ?

...全文
310 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧