SQLSERVER 使用存储过程生成流水号

 

  1 DECLARE @fn VARCHAR(100) --序列号字典中某规则的名称
  2 DECLARE @glide VARCHAR(100)
  3 SET @fn='2010'
  4 EXEC GETGLIDE @fn, @glide OUTPUT
  5 PRINT @glide 
  6 /***************************************************************************************************************************/
  7 DELETE FROM sys_business_glide
  8 
  9 INSERT INTO sys_business_glide(
 10 FNAME,    
 11 glide,    
 12 PREFIX,    
 13 POSTFIX,    
 14 DATEGLIDE,    
 15 GLIDELEN
 16 )VALUES(
 17 '2010',
 18 9999,
 19 '',
 20 '',
 21 '1',
 22 12
 23 )
 24 ;
 25 UPDATE sys_business_glide SET glide=glide+9998
 26 WHERE fname='2010'
 27 
 28 SELECT * FROM sys_business_glide
 29 
 30 
 31 DROP TABLE sys_business_glide
 32 
 33 SELECT * FROM sys_business_glide
 34 
 35 /*********************************************************************************************************************/
 36 CREATE TABLE sys_business_glide(
 37 FNAME    VARCHAR(100),--用于区分的流号名称
 38 GLIDE    INT,--当前序列号值
 39 PREFIX    VARCHAR(4),--序列号前缀
 40 POSTFIX    VARCHAR(4),--序列号后缀
 41 DATEGLIDE    CHAR(1),--是否包含时间 (1 包含 0 不包含)
 42 GLIDELEN    INT,--序列号长
 43 GLIDEDATE    DATETIME DEFAULT GETDATE() --当前序列所在日期值
 44 );
 45 
 46 ALTER PROCEDURE [dbo].[GETGLIDE]
 47 @fn VARCHAR(100) ,--序列号字典中某规则的名称
 48 @glide VARCHAR(100) OUTPUT--输出当前序列号
 49 AS
 50 DECLARE @i INT = 0 ,
 51 @strlen INT = 0 ,
 52 @strtemp VARCHAR(20) = '' ,
 53 @exception INT= 0 ,
 54 @t_count INT= 0 ,--当前序列号值(变化部分)
 55 @PREFIX VARCHAR(4) ,--前缀
 56 @POSTFIX VARCHAR(4) ,--后缀
 57 @DATEGLIDE CHAR(1) ,--是否包含时间 (1 包含 0 不包含)
 58 @GLIDELEN INT,--序列号总长度
 59 @GLIDEDATE DATETIME;--当前序列所在日期值
 60 BEGIN
 61 ----初始值
 62 SELECT @exception = COUNT(*)
 63 FROM sys_business_glide WITH(NOLOCK)
 64 WHERE FNAME = @fn;
 65 
 66 SELECT @t_count=    GLIDE ,
 67 @PREFIX =    PREFIX ,
 68 @POSTFIX =    POSTFIX ,
 69 @DATEGLIDE =    DATEGLIDE ,
 70 @GLIDELEN =    GLIDELEN,
 71 @GLIDEDATE=    GLIDEDATE
 72 FROM sys_business_glide WITH(NOLOCK)
 73 WHERE FNAME = @fn;
 74 
 75 
 76 IF ( @exception = 0 )
 77 BEGIN    
 78 ----不存在此序列号
 79 SET @glide = '当前不存在此名称的序列号规则';
 80 END;
 81 ELSE
 82 BEGIN
 83 ----存在此序列号
 84 SET @t_count = @t_count + 1;
 85 --------拼接序列号 
 86 IF ( @DATEGLIDE = '1' )
 87 --包含时间
 88 BEGIN
 89 SET @strlen = LEN(@PREFIX+ REPLACE(CONVERT(VARCHAR(10), @GLIDEDATE, 23),'-', '')
 90 + CAST(@t_count AS VARCHAR)
 91 + @POSTFIX);
 92 IF ( @GLIDELEN > @strlen )
 93 --需补0
 94 BEGIN
 95 WHILE @i < ( @GLIDELEN - @strlen )
 96 BEGIN
 97 SET @strtemp = @strtemp + '0'; 
 98 SET @i = @i + 1;
 99 END;
100 SET @glide = @PREFIX
101 + REPLACE(CONVERT(VARCHAR(10), @GLIDEDATE, 23), '-', '') + @strtemp
102 + CAST(@t_count AS VARCHAR) + @POSTFIX;
103 END;
104 ELSE
105 IF ( @GLIDELEN = @strlen )
106 --不需要补0
107 BEGIN
108 SET @glide = @PREFIX
109 + REPLACE(CONVERT(VARCHAR(10),@GLIDEDATE, 23),
110 '-', '')
111 + CAST(@t_count AS VARCHAR) + @POSTFIX;
112 END;
113 ELSE
114 --长度超出
115 BEGIN
116 --SET @glide = '序列号长度设置有问题';
117 UPDATE sys_business_glide
118 SET GLIDEDATE=DATEADD(DAY,1,GLIDEDATE)
119 WHERE FNAME = @fn;
120 SET @GLIDEDATE = DATEADD(DAY,1,@GLIDEDATE);
121 
122 SET @t_count=1;
123 SET @strlen = LEN(@PREFIX+ REPLACE(CONVERT(VARCHAR(10), @GLIDEDATE, 23),'-', '')
124 + CAST(@t_count AS VARCHAR)
125 + @POSTFIX);
126 IF ( @GLIDELEN > @strlen )
127 --需补0
128 BEGIN
129 WHILE @i < ( @GLIDELEN - @strlen )
130 BEGIN
131 SET @strtemp = @strtemp + '0'; 
132 SET @i = @i + 1;
133 END;
134 SET @glide = @PREFIX
135 + REPLACE(CONVERT(VARCHAR(10), @GLIDEDATE, 23), '-', '') + @strtemp
136 + CAST(@t_count AS VARCHAR) + @POSTFIX;
137 END;
138 
139 END;
140 END;
141 ELSE
142 --不包含时间
143 BEGIN
144 SET @strlen = LEN(@PREFIX + CAST(@t_count AS VARCHAR)
145 + @POSTFIX);
146 IF ( @GLIDELEN > @strlen )
147 --需补0
148 BEGIN
149 SET @i = 0;
150 WHILE @i < ( @GLIDELEN - @strlen )
151 BEGIN
152 SET @strtemp = @strtemp + '0'; 
153 SET @i = @i + 1;
154 END;
155 SET @glide = @PREFIX + @strtemp
156 + CAST(@t_count AS VARCHAR) + @POSTFIX;
157 END;
158 ELSE
159 IF ( @GLIDELEN = @strlen )
160 --不需要补0
161 BEGIN
162 SET @glide = @PREFIX
163 + CAST(@t_count AS VARCHAR) + @POSTFIX;
164 END; 
165 ELSE
166 --长度超出
167 BEGIN
168 SET @glide = '序列号长度设置有问题';
169 END;
170 END;
171 --------修改当前变化部分值
172 UPDATE sys_business_glide
173 SET glide = CAST(@t_count AS INT)
174 WHERE FNAME = @fn; 
175 END;
176 END;
View Code

 

posted @ 2017-08-16 11:46  haikuang  阅读(307)  评论(0)    收藏  举报