【问题标题】:SQL Server 2008 R2 - Generating unique numberSQL Server 2008 R2 - 生成唯一编号
【发布时间】:2019-02-15 11:15:58
【问题描述】:

要求

我想要一种以连续序列生成新的唯一编号(发票编号)的方法(生成新编号时不应遗漏任何编号)

有效示例:1、2、3、4

无效示例:1、2、4、3(不连续)

当前架构

这是我现有的表 Test 表架构

我想出的解决方案

在做了一些研究之后,我想出了下面的代码,它现在似乎可以工作了。

DECLARE @i as int=0
While(@i<=10000 * 10000)
BEGIN
    Begin Transaction

        Insert Into Test(UniqueNo,[Text])values((Select     IsNull(MAX(UniqueNo),0)+1 from Test with (TABLOCK)),'a')
    COMMIT  

    SET @i = @i + 1;
END

测试

我尝试从 12 个不同的 SQL 查询或 12 个线程运行代码,目前即使在插入 162,921 行

@987654322 之后,它也会为每条记录生成新的唯一值@

主要问题

上面的代码会导致重复值吗?

我通过点击和试用方法进行了尝试,当我深入了解 Transaction Locking 选择时,它完美地工作但是语句为整个表生成一个共享锁,这意味着它将允许并发事务访问相同的数据,对吧?

也就是说,多个交易可以产生重复的值,对吧?

那我怎么还看不到任何重复的值呢?

编辑

根据大卫的评论
我不能使用身份字段,因为在任何情况下,如果我删除一条记录,我将很难填写该数字。

【问题讨论】:

  • 为什么不直接使用 IDENTITY column 让 SQL Server 为您创建值?
  • @DavidG 因为如果有人删除任何行,那么我将无法再使用该号码
  • @SeanLange 如何解决 OP 删除发票的问题?这显然打破了顺序的性质,你不能把它们全部重新编号吗?
  • @DavidG 也许问题应该是为什么在世界上首先要删除发票?我提供它只是作为我参与的项目处理完美顺序编号方式的一个例子。
  • @SeanLange 确实如此。具有连续值并能够删除的要求是互斥的,再多的 TABLOCK 也无济于事。

标签: sql-server transactions sql-server-2008-r2 locking


【解决方案1】:

这是可以创建您的countinues支票号码的程序

create procedure [dbo].[aa] @var int
as
declare @isexists int=0
declare @lastnum int=0
set @isexists=(select isnull((select [text] from t000test where [text]=@var),0))
if(isnull(@isexists,0)<=0)
begin 
 set @lastnum=(select isnull( max([text]),0) from t000test )
 if(@var>@lastnum)
 begin
  insert into t000test(text) values (@var)
 end
 else
  print 'your number dose not in rang'
end
else
print 'your number exists in the data'
GO

你可以像这样测试这个过程:

exec dbo.aa 6 -- 或任何你喜欢的数字

这个循环会根据你喜欢的范围自动创建你的号码

declare @yourrange int =50
declare @id int =0;
while @yourrange>0
begin
exec dbo.aa @id
set @id=@id+1;
set @yourrange=@yourrange-1;
end

我使用的是 50,但您可以使用更多或更少的范围

【讨论】:

  • 感谢您的回复,但这根本没有帮助,因为我的代码至少通过事务锁定来保护它免受数据重复,并且据我所知,您只是在尝试验证没有事务锁定的数据库中的数据,如果超过 12 个线程同时尝试插入数据,则会在短期内产生重复的数字
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多