Sql server 2008 r2 连续数字-SQL Server 2008 R2

Sql server 2008 r2 连续数字-SQL Server 2008 R2,sql-server-2008-r2,numbers,sequential,Sql Server 2008 R2,Numbers,Sequential,我需要在表列中按顺序(1、2、3、4…)输入数字。 这些是发票编号,它们需要连续,没有间隙,没有重复。这是一项强制性要求,实际上是一项财政要求,所以我不能跳过它 我目前的做法是使用第二个“Numbers”表,它有两列(Id,LastNumber),上面有一条记录,Id=1。 这就是我现在正在做的: 1.从Id=1的带有(xlock,rowlock)的数字中选择(LastNumber+1)作为数字 2.分配编号,对其他表进行其他插入和更新。 3.更新编号集LastNumber=@Number,其中

我需要在表列中按顺序(1、2、3、4…)输入数字。 这些是发票编号,它们需要连续,没有间隙,没有重复。这是一项强制性要求,实际上是一项财政要求,所以我不能跳过它

我目前的做法是使用第二个“Numbers”表,它有两列(Id,LastNumber),上面有一条记录,Id=1。 这就是我现在正在做的: 1.从Id=1的带有(xlock,rowlock)的数字中选择(LastNumber+1)作为数字 2.分配编号,对其他表进行其他插入和更新。 3.更新编号集LastNumber=@Number,其中Id=1--@Number是在步骤1中检索到的编号 4.交易结束

我正在尝试使用锁定,不知道我是否正确,最有效的解决方案是什么? 如上所述,这是一项强制性要求,编号必须连续、无间隔、无重复。 该表用于网络中多个客户端的应用程序中。我使用SQLServer2008R2

我发现了类似的问题:

这里给出的解决方案是使用一些T-SQL代码来获取表中的最大值,但是如果两个客户端同时调用此代码会发生什么情况?是否将生成2个重复编号


谢谢

您需要一笔交易。通过首先执行更新,您可以有效地从其他共享锁锁定行,直到事务完成,然后返回新的编号

BEGIN TRAN
    UPDATE Numbers SET Number = Number + 1 WHERE Id = 12
    SELECT Number FROM Numbers WHERE Id = 12
COMMIT

谢谢,事实上我使用BEGIN TRAN作为第一步。我犯了一个错误,在写问题时省略了第一步。但我正在使用它。你的意思是,即使我使用锁提示,它们也不会起作用?我不是说锁提示不起作用,但我通常看到它们造成的麻烦比它们解决的要多。如果你没有把它们弄对,它可能会变得一团糟。我认为在这里没有必要。您可以通过两个查询窗口来证明这一点,运行begin tran,然后只运行update语句,然后在第二个窗口中尝试从表中进行选择。如果使用
sp_who
,您会注意到第二个查询将被阻止(但不是死锁),因为在提交运行之前,请求的共享读取锁不会被授予。这可能会有帮助