zoukankan      html  css  js  c++  java
  • 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

     编码规则:符合日期、流水、自定义特定常量@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)
  • 相关阅读:
    [注]打动我的50句广告语
    [SD.TEAM语录]AC语录
    [SD.TEAM语录]阿翔语录
    [安卓基础] 009.组件Activity详解
    [Python自学] day-21 (1) (请求信息、html模板继承与导入、自定义模板函数、自定义分页)
    [Python自学] day-20 (Django-ORM、Ajax)
    [Python自学] day-19 (2) (Django-ORM)
    [Python自学] day-19 (1) (FBV和CBV、路由系统)
    [Python自学] day-18 (2) (MTV架构、Django框架、模板语言)
    [Python自学] day-18 (1) (JS正则、第三方组件)
  • 原文地址:https://www.cnblogs.com/zengtianli/p/10512252.html
Copyright © 2011-2022 走看看