sqlserver 规则式定制化生成流水号

--规则式定制化流水号,需先取最大值以及数据特殊变化字符串
ALTER
FUNCTION [dbo].[f_GivenNo] ( @strRule VARCHAR(50), --规则 @maxStr VARCHAR(50), --取最大号数据编号 @Astr VARCHAR(30) ,--最大号数据的产品类别字符串 @NAstr VARCHAR(30) --产品类别新字符串 ) RETURNS VARCHAR(50) AS BEGIN DECLARE @str VARCHAR(50) --添加了年份的字符串=用于比较 DECLARE @str2 VARCHAR(50) --添加了年份的字符串=用于替换 DECLARE @i1 INT =0 --流水起始 DECLARE @i2 INT =0 --流水结束 DECLARE @ni1 INT =0--年流水起始 DECLARE @nilen INT =0--年流水结束 DECLARE @nianStr VARCHAR(10) -- DECLARE @cnianStr VARCHAR(10) --当前年 DECLARE @ctr VARCHAR(50) --当前匹配的字符串 DECLARE @ilen INT =0 --流水长度 DECLARE @maxi int =0 --当前最大流水号 DECLARE @maxStri VARCHAR(50) --当前最大流水号 DECLARE @newmaxStri VARCHAR(50) --当前最大流水号 --去v SET @str=REPLACE(@strRule,'@v',ISNULL(@Astr,'')) --年份 IF CHARINDEX('{yy}',@strRule)>0 BEGIN SET @ni1=CHARINDEX('{yy}',@str) SET @nilen=2 SET @cnianStr=RIGHT(DATENAME(yy,GetDate()),2) SET @str= REPLACE(@strRule,'{yy}',@cnianStr) --yy END ELSE IF CHARINDEX('{yyyy}',@str)>0 BEGIN SET @ni1=CHARINDEX('{yyyy}',@str) SET @nilen=4 SET @cnianStr=DATENAME(yy,GetDate()) SET @str= REPLACE(@strRule,'{yyyy}',@cnianStr) --yyyy END ELSE IF CHARINDEX('{yymm}',@str)>0 BEGIN SET @ni1=CHARINDEX('{yymm}',@str) SET @nilen=4 SET @cnianStr=RIGHT(DATENAME(yy,GetDate()),2) + DATENAME(mm,GETDATE()) SET @str= REPLACE(@strRule,'{yymm}',@cnianStr) --yymm END ELSE IF CHARINDEX('{yyyymm}',@str)>0 BEGIN SET @ni1=CHARINDEX('{yyyymm}',@str) SET @nilen=6 SET @cnianStr=DATENAME(yy,GetDate())+ DATENAME(mm,GETDATE()) SET @str= REPLACE(@strRule,'{yyyymm}',@cnianStr) --yyyymm END SET @str2=@str SET @i1=CHARINDEX('{',@str) SET @i2=CHARINDEX('}',@str) SET @ilen=@i2-@i1-1; --抛出异常 IF @i1=0 OR @i2=0 OR @ilen=0 BEGIN DECLARE @EXCEPTION VARCHAR(50)='编码规则非法,获取编码失败' RETURN CAST(@EXCEPTION as int) END IF ISNULL(@maxStr,'')<>'' BEGIN --取得数据的年 SET @nianStr= SUBSTRING(@maxStr,(@ni1-(CASE WHEN @i1<@ni1 THEN 2 ELSE 0 END)),@nilen) SET @newmaxStri=REPLACE(@maxStr,left(@maxStr,@i1-1),'')--替换数字前 SET @newmaxStri=REPLACE(@newmaxStri,RIGHT(@maxStr,LEN(@maxStr)-(@i2-2)),'')--替换数字后 --检测长度是否一致 IF ISNUMERIC(@newmaxStri)=0 OR LEN(@newmaxStri)<>@ilen OR (LEN(@maxStr)-LEN(@Astr))<>(LEN(@str)-2-2) --减去@v-{0000}的{} OR @nianStr<>@cnianStr BEGIN SET @maxi =1 END ELSE BEGIN SET @maxi=CAST (@newmaxStri AS INT); SET @maxi=@maxi +1 END END ELSE BEGIN SET @maxi =1 END SET @ctr=left(@str2,@i1-1)+right('000000000000000' + (CAST(@maxi AS VARCHAR(50))),@ilen)+RIGHT(@str2,LEN(@str2)-(@i2)) SET @ctr=REPLACE(@ctr,'@v',@NAstr) RETURN @ctr END

猜你喜欢

转载自www.cnblogs.com/zengtianli/p/10512252.html