34,588
社区成员
发帖
与我相关
我的任务
分享
--流水号格式: yyMMdd+0001 自增,
--有相同的CO1,CO2则使用相同的流水号
--如果存在同一天的流水号就自增,比如有1209050001 的流水号记录,则从1209050002 开始生成,没有就从yyMMdd0001开始
CREATE TABLE #TMP
(
ID VARCHAR(10),
SerialNumber int, --流水号
CO1 VARCHAR(10),
CO2 VARCHAR(20)
)
INSERT INTO #TMP SELECT '0001',1209050001,'GG','MM'
INSERT INTO #TMP SELECT '0002',null,'AA','BB'
INSERT INTO #TMP SELECT '0003',null,'FF','DD'
INSERT INTO #TMP SELECT '0004',null,'CC','BB'
INSERT INTO #TMP SELECT '0005',null,'AA','BB'
--最后显示效果
--0001, 1209050001,GG,MM
--0002, 1209050002,AA,BB
--0003, 1209050003,FF,DD
--0004, 1209050004,CC,BB
--0005, 1209050002,AA,BB
use tempdb
go
--创建当天序号表
create table tabSN(sn int,sndt datetime)
go
--创建历史序号表
create table tabSNHist(sn INT,sndt datetime)
go
--
create proc uspSN
(
@sn char(14) output
)
as
--开始事务
set xact_abort on
begin transaction
--判断序号表是否有数据,若没有则新增一条数据
if (select count(1) from tabSN)=0
begin
insert into tabSN values(000000,GETDATE())
end
--取出序号表中的日期
DECLARE @sndt datetime
set @sndt=(select sndt from tabSN);
--判断是否发生跨天情况,,若是则移动到历史表
if CONVERT(char(10),@sndt,111)<>CONVERT(char(10),getdate(),111)
begin
insert into tabSNHist select * from tabSN;
truncate table tabSN;
insert into tabSN values(000000,getdate())
end
--将号码累加1,作为最后操作时间
update tabsn set sn=sn+1 ,sndt=GETDATE()
--出去序号,转换成YYYYMMDDNNNNNN
SELECT @sn=CONVERT(VARCHAR(10),SNDT,112)+RIGHT('000000'+CONVERT(VARCHAR(6),SN),6)
FROM tabSN;
COMMIT TRANSACTION
GO
--使用存储过程产生序号
DECLARE @SN CHAR(14)
EXEC uspSN @SN OUTPUT
SELECT @SN 'SN'