如何使用SQL Server获取身份规范的下一个值?
不要说Select (id+1) from Table1
,因为它在删除行时会产生错误的结果。
答案 0 :(得分:5)
首先,无论你做什么,你都可能做错了,因为并发。
但您可以使用
获取标识列的下一个值select ident_current('TableName') + ident_incr('TableName')
答案 1 :(得分:4)
你无法知道,你不应该猜测。重新思考你的问题很重要。例如,停止使用标识并生成您自己的ID,或转而使用类似uniqueidentifier
的内容,您可以控制它,并且不会在线程之间发生冲突。
下一条记录的标识值不具有确定性。考虑一下这段代码;
begin tran
insert into table values ('my new value')
rollback tran
即使此代码未插入记录,它也会更新生成的下一个ID,并导致间隙。因此,如果表格的最大ID = 4,那么您运行此代码,然后执行您提交的插入,该记录的ID将为6,而不是5。
因为SQL Server控制了这个值,所以只有在系统遇到更多负载或人们做高级事务(如使用事务)之前,您的预测才会正确。
它是问题的经典来源,所以不要这样做。
另一种选择,如果你想控制ID,就是使用类似HILO生成器的东西 - This RavenDB document解释了这个想法的原理。