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 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 =@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就另當別論了。