在开发的过程中,我们经常会遇到要生成一些固定格式字符串,例如“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. 归并排序/合并排序c++实现

    #include <iostream>#include<string.h> using namespace std;class merges{public:void merge ...

  2. eclipse中导入dtd文件实现xml的自动提示功能

    以mybatis为例 1.mybatis的xml文件头: (1)config文件: <?xml version="1.0" encoding="UTF-8" ...

  3. doctotext

    文档解析库 http://www.it610.com/article/1936051.htm

  4. [BAT]操作系统定时任务调用批处理忽略error继续运行的方法

    如下,通过forfiles删除7天以前生成的一些文件,当不存在满足搜索条件的文件时,就会报错:ERROR: No files found with the specified search crite ...

  5. Java数据结构和算法(四)赫夫曼树

    Java数据结构和算法(四)赫夫曼树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 赫夫曼树又称为最优二叉树,赫夫曼树的一个 ...

  6. 2018.10.14 bzoj4571: [Scoi2016]美味(主席树)

    传送门 自认为是一道思想很妙的题. 直接分析问题. 如果没有xxx的干扰直接上可持久化01trie01trie01trie走人. 但现在有了xxx这个偏移量. 相当于把整个01trie01trie01 ...

  7. 2018.09.26洛谷P1084 疫情控制(二分+倍增)

    传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...

  8. Navicat for oracle cannot load OCI DLL

    Navicat for oracle 提示 cannot load OCI DLL87,126,193 instant client package is required for basic and ...

  9. HTML中submit和button的区别

    submit是button的一个特例,也是button的一种,它把提交这个动作自动集成了. 如果表单在点击提交按钮后需要用JS进行处理(包括输入验证)后再提交的话,通常都必须把submit改成butt ...

  10. Android在layout xml中使用include[转]

    在Android的layout样式定义中,可以使用xml文件方便的实现,有时候为了模块的复用,使用include标签可以达到此目的.例如: <include layout="@layo ...