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

1.创建表

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

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

2、插入数据

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

 INSERT  [dbo].[SYS_TableNO]
( [TableCode] ,
[TableName] ,
[PrefixCode] ,
[UseTableName] ,
[SysID] ,
[Interval] ,
[GetIDType] ,
[SysIDLen] ,
[LastSysCode] ,
[LastSysDate] ,
[Property]
)
VALUES ( N'BX-LivingPaymentNO' ,
N'申请单号' ,
N'BX' ,
N'FY_LivingPayment' ,
1 ,
1 ,
1 ,
4 ,
N'BX201903150001' ,
'2019-03-15 12:00:00' ,
1
);

3、存储过程

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

 ALTER procedure [dbo].[PRC_SYS_GetNO] (
@TableCode varchar(20),
@SysID int output,
@SysCode varchar(40) output
) as
begin
declare @YEAR int,@MONTH int,@DAY int
declare @ISPACECODE int
DECLARE @LastSysDate CHAR(8),@GetIDType INT
select @YEAR=DATEPART(YY,GETDATE()),@MONTH=DATEPART(MM,GETDATE()),@DAY=DATEPART(DD,GETDATE()) SELECT @LastSysDate=CONVERT(char(8), LastSysDate, 112),@GetIDType=GetIDType
FROM SYS_TableNO WHERE TableCode=@TableCode --GetIDType=1.按照2位前缀+8位日期+N位序号,日结时N位序号重置为0
--GetIDType=2.按照SYSID连续增长,不重置为0
--SysIDLen:GetIDType=1时,限制第三段的ID长度;当GetIDType=2时,限制整段的SYSID长度
if exists(select 1 from SYS_TableNO where TableCode=@TableCode )
begin
begin tran
--如果IDType=1且是当天首条记录,将SysID更新为0
IF @GetIDType=1 AND @LastSysDate<>convert(char(8),@YEAR*10000+@MONTH*100+@DAY)
BEGIN
update SYS_TableNO set SysID=0+ISNULL(Interval,1) where TableCode=@TableCode
END
ELSE
begin
update SYS_TableNO set SysID=ISNULL(SysID,0)+ISNULL(Interval,1) where TableCode=@TableCode
end
select @SysCode=(case when GetIDType=1 then
PrefixCode+convert(char(8),@YEAR*10000+@MONTH*100+@DAY)
+right(convert(varchar,10000000000+SysID),SysIDLen)
when GetIDType=2 then right(convert(varchar,POWER(10,SysIDLen)+SysID),SysIDLen)
when GetIDType=3 then PrefixCode+right(convert(varchar,POWER(10,SysIDLen)+SysID),SysIDLen)
else 'NOT CONFIG.' END),@SysID=SysID
from SYS_TableNO
where TableCode=@TableCode
update SYS_TableNO set LastSysCode=@SysCode,LastSysDate=GETDATE() where TableCode=@TableCode
commit tran
end
end
GO

4、执行存储过程

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

 model.PaymentNo = BLL_SYS_TableNO.SYS_TableNO_Bll.GetProcSYS_TableNoById("BX-LivingPaymentNO").SysCode;

sql server生成自动增长的字母数字字符串的更多相关文章

  1. SQL Server 2012 自动增长列,值跳跃问题

    介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(in ...

  2. SQL Server 文件自动增长那些事

    方法 1. 把文件的增长设置为按照固定大小增长. 如filegrowth = 100MB; ------------------------------------------------------ ...

  3. SQL Server 2012 自动增长列,值跳跃问题(自增增加1000)

    介绍 从 SQL Server 2012 版本开始, 当SQL Server 实例重启之后,表格的自动增长列的值会发生跳跃,而具体的跳跃值的大小是根据增长列的数据类型而定的.如果数据类型是 整型(in ...

  4. Sql Server实现自动增长

    在学习中遇到这个问题 数据库里有编号字段 BH00001 BH00002 BH00003 BH00004 如何实现自动增长 --下面的代码生成长度为8的编号,编号以BH开头,其余6位为流水号. --得 ...

  5. SQL Server镜像自动生成脚本

    SQL Server镜像自动生成脚本 镜像的搭建非常繁琐,花了一点时间写了这个脚本,方便大家搭建镜像 执行完这个镜像脚本之后,最好在每台机器都绑定一下hosts文件,不然的话,镜像可能会不work 1 ...

  6. SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享

    SQL Server定时自动抓取耗时SQL并归档数据发邮件脚本分享 第一步建库和建表 USE [master] GO CREATE DATABASE [MonitorElapsedHighSQL] G ...

  7. ADO.NET 快速入门(十二):从 SQL Server 生成 XML 数据

    本文演示如何使用2种不同的方法从 SQL Server 生成 XML.   方法1:使用了 SqlCommand 的 ExecuteXmlReader 方法获取 XmlReader,然后使用 Data ...

  8. SQL Server定时自动抓取耗时SQL并归档数据脚本分享

    原文:SQL Server定时自动抓取耗时SQL并归档数据脚本分享 SQL Server定时自动抓取耗时SQL并归档数据脚本分享 第一步建库 USE [master] GO CREATE DATABA ...

  9. SQL Server 2008、SQL Server 2008R2 自动备份数据库

    让SQL Server 2008自动备份数据库,需要建立一个SQL Server作业,并启动SQL Server代理,使该作业定期运行. 具体来说,可以按以下步骤进行: 一.打开SQL Server ...

随机推荐

  1. IBM MQ 学习

    import java.io.IOException; import java.util.HashMap; import java.util.Map; import com.ibm.mq.MQC; i ...

  2. Linux CentOS6.6 NFS服务的配置与安装

    一.简介 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客 ...

  3. DB2事务日志

    1.DB2数据库的日志原理 事务日志记录数据库中所有对象和数据的改变,在早前版本中最大可达256G,其大小为( logprimary + logsecond ) * logfilsiz,其中logpr ...

  4. dedecms操作数据库

    重要的事情说三遍:代码复制完要格式化,格式化,格式化,最好重新抄一遍,小心陷阱 一.配置数据库配置文件路径/data/common.inc.php二.连接数据库dirname(__FILE__)表示当 ...

  5. mathematica9激活

    1.打开m9软件 2.打开keygen软件 3.点手动输入验证码,输入里面的id到keygen软件再点save mathpath 4.复制keygen软件里面 的mathpass到 将生成的mathp ...

  6. WebService安全加密

    众所周知,WebService访问API是公开的,知道其URL者均可以研究与调用.那么,在只允许注册用户的WebService应用中,如何确保API访问和通信的安全性呢?本文所指的访问与通信安全性包括 ...

  7. eclipse代码自动提示,eclipse设置代码自动提示

    eclipse代码自动提示,eclipse设置代码自动提示 eclipse是很多JAVA开发者基本上都用的工具,用它可以很方便的开发JAVA代码,当编写JAVA代码时,大部分人都是按组合键[Alt+/ ...

  8. =delete(c++11)

    1.为什么要阻止类对象的拷贝? 1)有些类,不需要拷贝和赋值运算符,如:IO类,以避免多个拷贝对象写入或读取相同的IO缓冲 2.如何阻止? 1)不定义拷贝构造函数和拷贝赋值运算符时,好心的编译器也会及 ...

  9. Linux 部署 tomcat 常用命令

    1.  文件夹重命名 mv somedir somedir1 2. 授权所有子目录 chmod -R 777 somedir 3.授权单个目录 chmod 777 somedir 4.实时打印控制台日 ...

  10. laravel命令

    新建控制器 php artisan make:controller IssuesController 新建控制器并自动生成对应RESTful风格路由相关CURD方法 php artisan make: ...