表标识规范的下一个值 - SQL Server

时间:2016-09-01 10:22:53

标签: c# asp.net sql-server

如何使用SQL Server获取身份规范的下一个值?

不要说Select (id+1) from Table1,因为它在删除行时会产生错误的结果。

2 个答案:

答案 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解释了这个想法的原理。