--种子表
--@prefix 前缀
--@seed 种子值
create table RefNoSeed(
prefix char(4) unique,
seed int
)
go --测试表
--@insertTime 插入时间(仅测试用途)
--@RefNo 流水号
create table RefNoTable(
insertTime datetime unique,
RefNo varchar(20) unique
)
go if OBJECT_ID('F_FormattingSerialNumber','FN') is not null
drop function dbo.F_FormattingSerialNumber
go
--格式化数值,用于把种子数值转换为10个字符长度的字符串,不足位数前面添加0
--@sn 种子值
--returns 10个字符长度字符串
create function dbo.F_FormattingSerialNumber(@sn int)
returns varchar(10)
begin
return cast(replicate('',10-len(cast(@sn as varchar(10)))) + cast(@sn as varchar(10)) as varchar(10))
end
go if OBJECT_ID('P_GenerateRefNo','P') is not null
drop proc dbo.P_GenerateRefNo
go
--获取前缀,生成流水号
--@prefix 前缀
--@timeNow 时间(仅测试用途)
create proc dbo.P_GenerateRefNo
@prefix varchar(20),
@timeNow datetime
as
begin try
--开启事务
begin tran
set nocount on;
declare @newSeed int
--根据前缀获取现在的种子值并+1为新种子值
set @newSeed=(select seed from RefNoSeed where prefix=@prefix)+1
--若不存在种子值,则按照前缀添加种子值,并把新种子值设置为1
if @newSeed is null
begin
insert into RefNoSeed values(@prefix,0)
set @newSeed=1
end
--生成流水号
declare @sn varchar(20)
set @sn=@prefix + cast(YEAR(@timeNow) as CHAR(4))+ dbo.F_FormattingSerialNumber(@newSeed)
--插入数据表中
insert into RefNoTable (insertTime,RefNo)values(@timeNow,@sn)
--插入成功后更新种子值
update RefNoSeed set seed=@newSeed where prefix=@prefix
--无错则提交事务
commit
end try
begin catch
--出错则进行回滚
rollback
end catch
go --插入测试数据
declare @timenow datetime
set @timenow=GETDATE()
exec P_GenerateRefNo 'AB',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'AB',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'AB',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'AB',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'BF',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'BF',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'PF',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'PF',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'PF',@timenow
waitfor delay '00:00:00.02'
set @timenow=GETDATE()
exec P_GenerateRefNo 'RG',@timenow --查看数据
select*from RefNoSeed order by prefix
select*from RefNoTable order by REFNO --清除数据
delete RefNoSeed
delete RefNoTable drop table RefNoSeed
drop table RefNoTable if OBJECT_ID('F_FormattingSerialNumber','FN') is not null
drop function dbo.F_FormattingSerialNumber
go
if OBJECT_ID('P_GenerateRefNo','P') is not null
drop proc dbo.P_GenerateRefNo
go

SQLServer根据不同前缀生成多套流水号的更多相关文章

  1. SQLSERVER之高灵活的业务单据流水号生成

    SQLSERVER之高灵活的业务单据流水号生成 最近的工作中要用到流水号,而且业务单据流水号生成的规则分好几种,并非以前那种千篇一律的前缀+日期+流水号的简单形式,经过对业务的分析,以及参考网上程序员 ...

  2. 调试SQLSERVER (一)生成dump文件的方法

    调试SQLSERVER (一)生成dump文件的方法 调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置调试SQLSERVER (三)使用Windbg调试SQLSERVER ...

  3. sqlserver 表中记录生成insert,可以加条件,可以生成建表语句

    sqlserver 表中记录生成insert,可以加条件,可以生成建表语句 create PROCEDURE [sp_getinsert] ( ) , --如果非默认架构,可以加上架构名 例如:sch ...

  4. 【原】Redis实现生成自增流水号

    场景: 公司内部有个业务场景是后台审核之后需要生成一个流水号,规则是: 201807280001,201807280002,201807280003,后面四位依次递增,前面年月日取当前时间并且转换成y ...

  5. Dynamics 365中使用计算字段自动编号字段实时工作流自动生成分组编码加流水号的自动编号字段值

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. SqlServer按时间自动生成生成单据编号

    SET @_tmpDateTime = GETDATE() EXEC dbo.Dtw_Common_GenerateProofCode @ProofType = 'SO',@WhsCode=@WhsC ...

  7. 外包采用Gradle生成多套app打包

    目的:可修改app名称.icon.包名.接口地址及其它 一.      修改基本配置(包名.版本号等) 配置module下的build.gradle 添加productFlavors例如: produ ...

  8. SQL 生成可配置流水号

    需求背景每执行一次方法,根据公式返回最新的流水号.第一次使用时需要先插入一条数据,BizSeqValue 为流水起始号:A2014030000,Formula 为公式:A[yyyy][mm][c4], ...

  9. SQLserver利用系统时间生成“2015-11-30 00:00:00.000”类型的时间

    select getdate() ---当前时间:2015-12-18 10:20:24.097 -------------------建立测试表 Create Table #Test ( ID IN ...

随机推荐

  1. LINQ TO ENTITY 根据Birthday获取Age

    from emp in EmployeeInfo let years = EntityFunctions.DiffYears(emp.Birthday.Value,DateTime.Now) let ...

  2. JAVA SE 803 考试前突击

    考试的宗旨仍然是掌握基础知识,不过鉴于Oracle的这个认证考试还有不少的大家来找茬的成份在,所以一定一定要细心为上.   关于抽象类的坑点集合: 抽象类不是必须得有抽象方法,但有抽象方法的类必须是抽 ...

  3. String.format详解(转)

    一.前言 String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", " ...

  4. Unitils集成DBUnit的问题-解决方案

    Unitils在集成DBunit时,如果数据库是mysql时,就会出现一些如下: org.unitils.core.UnitilsException: Error inserting test dat ...

  5. caffe上使用hdf5格式文件以及回归(regression)问题

    最近用caffe做了一下regression问题,先用data layer中的data,float_data试了一下,data用来存放图片,float_data存放regression的values, ...

  6. (oracle/mysql)启停,导入导出,DB字符集

    ==================================================================================== DB启动停止 ======== ...

  7. Reactor模式与Proactor模式

    该文章总结了网上资源对这两种模式的描述 原文地址:http://www.cnblogs.com/dawen/archive/2011/05/18/2050358.html 1.标准定义 两种I/O多路 ...

  8. Log4net对数据库的支持

    记录到Oracle数据库中 <appender name="AdoNetAppender_Oracle" type="log4net.Appender.AdoNet ...

  9. 让我们一起Go(十)

    前言: 本系列还没流产,继续难产中,哈哈,只怪我没专心,在期间又偷偷去学了python,ruby,scala,haskell这几种语言,如果你不幸是本系列的读者,那么你得慢慢等后面的了,等不及可以过几 ...

  10. Django Push HTTP Response to users

    Django Push HTTP Response to users I currently have a very simple web application written in Django, ...