SQlSERVER生成唯一编号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQlSERVER生成唯一编号相关的知识,希望对你有一定的参考价值。

SQlSERVER生成唯一编号

基数表-用来存储编号前缀和类型

建表如下

CREATE TABLE [dbo].[SerialNo](
[sCode] [varchar](50) NOT NULL,
[sName] [varchar](100) NULL,
[sQZ] [varchar](50) NULL,
[sValue] [varchar](80) NULL,
CONSTRAINT [PK_SerialNo] PRIMARY KEY CLUSTERED 
(
[sCode] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

这个表需要手动添加你的前缀

例如:

技术分享

存储过程代码:

技术分享
 1 Create procedure [dbo].[GetSerialNo]   
 2 (   
 3    @sCode varchar(50)   
 4 )   
 5  
 6   as 
 7  
 8 --exec GetSerialNo   
 9  
10 begin 
11  
12    Declare @sValue  varchar(16),   
13 
14            @dToday   datetime,           
15 
16            @sQZ  varchar(50)  --这个代表前缀 
17  
18    Begin Tran     
19  
20    Begin Try   
21  
22      -- 锁定该条记录,好多人用lock去锁,起始这里只要执行一句update就可以了 
23     --在同一个事物中,执行了update语句之后就会启动锁 
24      Update SerialNo set sValue=sValue where [email protected]   
25  
26      Select @sValue = sValue From SerialNo where [email protected]   
27  
28      Select @sQZ = sQZ From SerialNo where [email protected]   
29 
30     -- 因子表中没有记录,插入初始值--基数据必须手动去创建   
31  
32     If @sValue is null   
33  
34      Begin 
35  
36        Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) + ‘000001‘)   
37  
38        Update SerialNo set [email protected] where [email protected]   
39  
40      end
41      
42    else   
43  
44      Begin               --因子表有记录   
45  
46        Select @dToday = substring(@sValue,1,6)   
47 
48       --如果日期相等,则加1   
49 
50        If @dToday = convert(varchar(6), getdate(), 12)   
51  
52          Select @sValue = convert(varchar(16), (convert(bigint, @sValue) + 1))   
53 
54       else              --如果日期不相等,则先赋值日期,流水号从1开始   
55  
56         Select @sValue = convert(bigint, convert(varchar(6), getdate(), 12) +‘000001‘)   
57  
58           
59 
60        Update SerialNo set sValue [email protected] where [email protected]   
61 
62      End 
63  
64      Select result = @[email protected]     
65  
66      Commit Tran   
67  
68    End Try   
69  
70    Begin Catch   
71  
72      Rollback Tran   
73  
74      Select result = ‘Error‘ 
75  
76    End Catch   
77 
78 end 
技术分享

执行:exec dbo.GetSerialNo ‘CUS‘

结果:CUS150413000001

此方法可用作生成流水号,使用update启动数据库锁,并发不会重复,可读性比较好,当然使用GUID就另当别论了。

以上是关于SQlSERVER生成唯一编号的主要内容,如果未能解决你的问题,请参考以下文章

解决“动软代码生成器在SqlServer中会将唯一索引识别为主键"的Bug

如何生成唯一订单号

业务编号生成器

SQL server 建立的触发器子查询返回值不唯一,需要用多个返回值如何操作

为 SQL Server 中的每个唯一编号分配新值

如何使用redis生成唯一编号及原理