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

摘要:
--对于常规自定义序列号,应首先获取最大值和特殊数据更改字符串ALTERFUNCTION[dbo][f_GivinNo](@strRuleVARCHAR(50),--rule@maxStrVARCHAR(50)),--get the maxdata number@AstrVARCHARR(30),--product category string of the maxdata@NastrVARCHARC(30)--new product cate类别字符串)RETURNSVARCHARD(50)ASBEGIND
--规则式定制化流水号,需先取最大值以及数据特殊变化字符串
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

 编码规则:符合日期、流水、自定义特定常量@v都可使用

例如:

C-02001-{yy}CQC{0000}@v

CQCNL{yyyy}CB{0000}

CE-02001-{yy}CQC{0000}

C-02001-{yy}CCRC{0000}

V-02001-{yy}CQC{0000}

W-{0000}-{yy}CNL

--测试数据 取得当前数据最大号、当前数据指定的常量字符、规则字符串、指定的新产量字符
--规则
DECLARE @strRule VARCHAR(50)= 'V-02001{0000}';--LEN(W-0001-19CNL)
--产品类别新字符串
DECLARE @NAstr VARCHAR(30)= '';
--取最大号数据编号
DECLARE @maxStr VARCHAR(50);
--最大号数据的产品类别字符串
DECLARE @Astr VARCHAR(30);
SELECT TOP 1
@maxStr=p.docCode ,
@Astr=ot.YPType
FROM dbo.BJ_OrderNewType ot
LEFT JOIN dbo.Pact p ON ot.Id = p.NewTypeId
WHERE ot.authenticationType = @strRule
AND LEN(p.docCode)=LEN(REPLACE(REPLACE(REPLACE(ot.authenticationType,'@v',ot.YPType),'{',''),'}',''))
ORDER BY p.createDate DESC;
SELECT dbo.f_GivenNo(@strRule, @maxStr,@Astr, @NAstr)

免责声明:文章转载自《sqlserver 规则式定制化生成流水号》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql_Navicat数据库破解分布式文件系统MFS、Ceph、GlusterFS、Lustre的比较下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

easyui textarea回车导致datagrid 数据无法展示的问题

textarea换行 在easyui中的datagrid中使用行内编辑时textarea的换行保存到mysql数据库为 在textarea中输入回车符 在js读取textarea中的值有 然后到业务层转换到string中就有可能变成空格形式然后被存入数据库,当在取出此值的时候则会变成空格的形式,因此我们需要将不显示的 替换一下。  在js取textarea...

location.href和location.replace和location.reload的不同(location.replace不记录历史)

location.href iframe.location.href window.location.href      整个URL字符串(在浏览器中就是完整的地址栏) reload 方法,该方法强迫浏览器刷新当前页面。     语法: location.reload([bForceGet])                               ...

Oracle系列之存储过程

涉及到表的处理请参看原表结构与数据Oracle建表插数据等等 判断是否是素数: create or replace procedure isPrime(x number) as flag number:=1; begin if x<2 then dbms_output.put_line('not prime'); else for i in...

经验解决Fragment被Replace后仍旧可见的问题

经验解决Fragment被Replace后仍旧可见的问题 网上问的问题,大多会提到替换了Fragment而发现之前被替换的仍旧显示在那里。我个人使用android 2.3 +support 开发包,在2.3系统上也出现类似问题。搜了下网上的问题,好像都没有找到解决方法。之后自己摸索。最后发现其实,对于Fragment的替换 JAVA代码基本上没啥,网上都是...

loki简单安装配置使用

Grafana Loki isa set of components that can be composed into a fully featured logging stack. Unlike other logging systems, Loki is built around the idea of only indexing labels f...

pg 中字符串中有特殊字符

pg 中字符串中有特殊字符的处理(比如换行符) imos=# SELECT replace('he o',E' ','L'); replace --------- he o (1 row) imos=# SELECT replace('he imos'# o',' ','L'); replace --------- he + o (...