SQlSERVER生成唯一编号

王朝学院·作者佚名  2016-05-25
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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 sCode=@sCode 25 26 Select @sValue = sValue From SerialNo where sCode=@sCode 27 28 Select @sQZ = sQZ From SerialNo where sCode=@sCode 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 sValue=@sValue where sCode=@sCode 39 40 end41 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 =@sValue where sCode=@sCode 61 62 End 63 64 Select result = @sQZ+@sValue 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就另当别论了。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航