zoukankan      html  css  js  c++  java
  • 在.Net程序中实现sql server生成自动增长的字母数字字符串

    在开发的过程中,我们经常会遇到要生成一些固定格式字符串,例如“BX201903150001”,结构为:BX+日期+N位序号,类似这种的字符串我们很难生成,在这里我们借助一个存储过程来实现这个功能。

    1.创建表

    该表用来存放我们要生成的字符串的规则和特性。

     1 CREATE TABLE [dbo].[SYS_TableNO]
     2 (
     3 [ID] [int] NOT NULL IDENTITY(1, 1),
     4 [TableCode] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL,
     5 [TableName] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL,
     6 [PrefixCode] [varchar] (6) COLLATE Chinese_PRC_CI_AS NULL,
     7 [UseTableName] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL,
     8 [SysID] [int] NULL,
     9 [Interval] [int] NULL CONSTRAINT [DF__SYS_Table__Inter__19071E83] DEFAULT ((1)),
    10 [GetIDType] [int] NULL,
    11 [SysIDLen] [int] NULL,
    12 [LastSysCode] [varchar] (40) COLLATE Chinese_PRC_CI_AS NULL,
    13 [LastSysDate] [datetime] NULL,
    14 [Property] [int] NULL
    15 ) ON [PRIMARY]
    16 GO
    17 ALTER TABLE [dbo].[SYS_TableNO] ADD CONSTRAINT [PK_MTableNO] PRIMARY KEY CLUSTERED  ([TableCode]) ON [PRIMARY]
    18 GO
    19 EXEC sp_addextendedproperty N'MS_Description', N'表单号码设置:
    20    1、当表MOrganization新增时,默认按组织机构插入n条记录
    21    2、取单规则如下:
    22       (1)GetIDType=1.按照2位前缀+8位日期+N位序号,日结时N位序号重置为0  
    23       (2)GetIDType=2.按照SYSID连续增长,不重置为0   
    24       (3)GetIDType=3.按照2位前缀+按照SYSID连续增长,不重置为0   
    25       (4)SysIDLength:当GETIDTYPE=1时,限制第三段的ID长度(N位序号);当GetIDType=2时,限制整段的SYSID长度 
    26    3、该表和存储过程GetNO同时使用,可以实现两种类型的单号:连续增长型的ID和符合规则的字符串Code,传递参数类型见存储过程', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', NULL, NULL
    27 GO
    28 EXEC sp_addextendedproperty N'MS_Description', N'表单编码:通常用相关表的主键字段来标识,但也有可能不是,大小写混合', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'TableCode'
    29 GO
    30 EXEC sp_addextendedproperty N'MS_Description', N'表单名称,例如:商品表、供应商采购订单等', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'TableName'
    31 GO
    32 EXEC sp_addextendedproperty N'MS_Description', N'单据前缀,例如:订单的号码前缀为PO', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'PrefixCode'
    33 GO
    34 EXEC sp_addextendedproperty N'MS_Description', N'对应系统表名', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'UseTableName'
    35 GO
    36 EXEC sp_addextendedproperty N'MS_Description', N'系统有效ID', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'SysID'
    37 GO
    38 EXEC sp_addextendedproperty N'MS_Description', N'ID间隔,默认为1,如果是总部、门店同时做单,可以总部为1,门店为2,确保单号不会重复', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'Interval'
    39 GO
    40 EXEC sp_addextendedproperty N'MS_Description', N'获取单号类型:1=按照n位前缀+8位日期+N位序号,日结时N位序号重置为0;2=按照SYSID连续增长,日结不重置为0', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'GetIDType'
    41 GO
    42 EXEC sp_addextendedproperty N'MS_Description', N'单号长度:如果是GetIDType=2,限制输出Code的整体长度,ID连续增长;GetIDType=1,限制输出Code后段的长度', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'SysIDLen'
    43 GO
    44 EXEC sp_addextendedproperty N'MS_Description', N'最后一次单据编码', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'LastSysCode'
    45 GO
    46 EXEC sp_addextendedproperty N'MS_Description', N'最后一次单号日期,含时分秒', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'LastSysDate'
    47 GO
    48 EXEC sp_addextendedproperty N'MS_Description', N'表单属性(Bit):0=用户可以定制;1=用户不可定制;2=不同组织具有不同的单号', 'SCHEMA', N'dbo', 'TABLE', N'SYS_TableNO', 'COLUMN', N'Property'
    49 GO

    2、插入数据

    我们先创建一天数据,来设置我们要生成的字符串规范。例如‘BX201903150001’,前缀BX,中间是日期,最后是4位自增数字字符串,自增幅度为1,相应的字段说明可以参考上面注释。

     1 INSERT  [dbo].[SYS_TableNO]
     2         ( [TableCode] ,
     3           [TableName] ,
     4           [PrefixCode] ,
     5           [UseTableName] ,
     6           [SysID] ,
     7           [Interval] ,
     8           [GetIDType] ,
     9           [SysIDLen] ,
    10           [LastSysCode] ,
    11           [LastSysDate] ,
    12           [Property]
    13         )
    14 VALUES  ( N'BX-LivingPaymentNO' ,
    15           N'申请单号' ,
    16           N'BX' ,
    17           N'FY_LivingPayment' ,
    18           1 ,
    19           1 ,
    20           1 ,
    21           4 ,
    22           N'BX201903150001' ,
    23           '2019-03-15 12:00:00' ,
    24           1
    25         );

    3、存储过程

    接下来就是写生成字符串的存储过程,我们只需要将:表单编码,传入,就可以生成生成我们先要的对应的字符串,具体写法如下

     1 ALTER procedure [dbo].[PRC_SYS_GetNO] (                          
     2   @TableCode varchar(20),                                
     3   @SysID int output,                               
     4   @SysCode varchar(40) output 
     5 ) as
     6 begin                      
     7   declare @YEAR int,@MONTH int,@DAY int                
     8   declare @ISPACECODE int   
     9   DECLARE @LastSysDate CHAR(8),@GetIDType INT
    10   select @YEAR=DATEPART(YY,GETDATE()),@MONTH=DATEPART(MM,GETDATE()),@DAY=DATEPART(DD,GETDATE())       
    11    
    12    SELECT @LastSysDate=CONVERT(char(8), LastSysDate, 112),@GetIDType=GetIDType
    13        FROM  SYS_TableNO WHERE TableCode=@TableCode  
    14                        
    15   --GetIDType=1.按照2位前缀+8位日期+N位序号,日结时N位序号重置为0  
    16   --GetIDType=2.按照SYSID连续增长,不重置为0   
    17   --SysIDLen:GetIDType=1时,限制第三段的ID长度;当GetIDType=2时,限制整段的SYSID长度         
    18   if exists(select 1 from SYS_TableNO where TableCode=@TableCode  ) 
    19   begin                                
    20     begin tran  
    21      --如果IDType=1且是当天首条记录,将SysID更新为0
    22     IF @GetIDType=1 AND @LastSysDate<>convert(char(8),@YEAR*10000+@MONTH*100+@DAY)
    23       BEGIN
    24         update SYS_TableNO set SysID=0+ISNULL(Interval,1) where TableCode=@TableCode  
    25       END
    26     ELSE
    27         begin    
    28          update SYS_TableNO set SysID=ISNULL(SysID,0)+ISNULL(Interval,1) where TableCode=@TableCode  
    29         end
    30       select @SysCode=(case when GetIDType=1 then 
    31                               PrefixCode+convert(char(8),@YEAR*10000+@MONTH*100+@DAY)                   
    32                               +right(convert(varchar,10000000000+SysID),SysIDLen)   
    33                             when GetIDType=2 then right(convert(varchar,POWER(10,SysIDLen)+SysID),SysIDLen)  
    34                             when GetIDType=3 then PrefixCode+right(convert(varchar,POWER(10,SysIDLen)+SysID),SysIDLen)  
    35                             else 'NOT CONFIG.' END),@SysID=SysID            
    36         from SYS_TableNO             
    37         where TableCode=@TableCode  
    38       update SYS_TableNO set LastSysCode=@SysCode,LastSysDate=GETDATE() where TableCode=@TableCode  
    39     commit tran                    
    40   end                                                                         
    41 end
    42 GO

     4、执行存储过程

    最后就是在我们的程序里进行执行存储过程了,存储过程返回来的就是我们需要的字符串,下面是我 的存储过程执行代码,这个要根据个人项目代码具体实现。

    1 model.PaymentNo = BLL_SYS_TableNO.SYS_TableNO_Bll.GetProcSYS_TableNoById("BX-LivingPaymentNO").SysCode;
  • 相关阅读:
    OS X进程管理之launchctl
    varnish-4.x 之varnishlog,varnishstat,varnishtop,varnishhist
    Java ClassLoader详解(转载)
    java线程中断[interrupt()函数] (转载)
    Struts2实例详解(转载)
    java 重定向和转发(转载)
    Java中Class.forName()的作用(转载)
    JSP页面的编码设置(转载)
    Struts2 实例(转载)
    Spring AOP(转载)
  • 原文地址:https://www.cnblogs.com/MirZhai/p/10536173.html
Copyright © 2011-2022 走看看