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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM