--編號表
create table tb_no(
name char(2) not null, --編號種類的名稱
days int not null, --儲存的是該種編號那一天的當前編號
head nvarchar(10) not null default '', --編號的字首
currentno int not null default 0, --當前編號
bhlen int not null default 6, --編號數字部分長度
yearmoth int not null --上次生成編號的年月,格式yyyymm
default convert(char(6),getdate(),112),
description nvarchar(50), --編號種類說明
tablename sysname not null, --當前編號對應的原始表名
keyfieldname sysname not null, --當前編號對應的原始表編號欄位名
primary key(name,days))
--這裡以一種單據的7天的資料來做測試
insert tb_no select 'cg',1,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
union all select 'cg',2,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
union all select 'cg',3,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
union all select 'cg',4,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
union all select 'cg',5,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
union all select 'cg',6,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
union all select 'cg',7,'cg',0,4,200501,n'採購訂單',n'tb',n'bh'
go--獲取新編號的儲存過程
create proc p_nextbh
@name char(2), --編號種類
@date datetime=null, --要獲取的當前日期,不指定則為系統當前日期
@bh nvarchar(20) output --新編號
asif @date is null set @date=getdate()
begin tran
--從編號表中獲取新編號
update tb_no set
@bh=head
+convert(char(6),@date,12)
+right(power(10,bhlen)
+case
when yearmoth=convert(char(6),@date,112)
then currentno+1
else 1 end
,bhlen),
currentno=case
when yearmoth=convert(char(6),@date,112)
then currentno+1
else 1 end,
yearmoth=convert(char(6),@date,112)
where name=@name
and days=day(@date)
and yearmoth<=convert(char(6),@date,112)
--如果要獲取的編號在編號表中已經過期,則直接從原始表中取編號
if @@rowcount=0
begin
declare @s nvarchar(4000)
select @s=n'select @bh='
+quotename(head+convert(char(6),@date,12),n'''')
+n'+right('+cast(power(10,bhlen)+1 as varchar)
+n'+isnull(right(max('+quotename(keyfieldname)
+n'),'+cast(bhlen as varchar)
+n'),0),'+cast(bhlen as varchar)
+n') from '+quotename(tablename)
+n' with(xlock,paglock) where '
+quotename(keyfieldname)
+n' like '+quotename(head+convert(char(6),@date,12)+n'%',n'''')
from tb_no
where name=@name
and days=day(@date)
and yearmoth>convert(char(6),@date,112)
if @@rowcount>0
exec sp_executesql @s,n'@bh nvarchar(20) output',@bh output
endcommit tran
gocreate table tb(bh char(12))
--獲取 cg 的新編號
declare @bh char(12)
exec p_nextbh 'cg','2005-1-1',@bh out
select @bh
--結果: cg0501010001
exec p_nextbh 'cg','2005-1-1',@bh out
select @bh
--結果: cg0501010002
exec p_nextbh 'cg','2005-1-2',@bh out
select @bh
--結果: cg0501020001
exec p_nextbh 'cg','2005-2-2',@bh out
select @bh
--結果: cg0402020001
exec p_nextbh 'cg','2004-2-2',@bh out
select @bh
--結果: cg0402020001
go
SQL生成 日期 流水號 的編號
以下 生成的編號長度為12,前6位為日期資訊,格式為yymmdd,後6位為流水號。建立得到當前日期的檢視 create view v getdate asselect dt convert char 6 getdate 12 go 得到新編號的函式 create function f nextbh ...
使用編號表生成流水號的示例 sql
編號表 create table tb no name char 2 primary key,編號種類的名稱 head nvarchar 10 not null default 編號的字首 currentno int not null default 0,當前編號 bhlen int not nul...
查表法按日期生成流水號 mssql
以下 生成的編號長度為12,前6位為日期資訊,格式為yymmdd,後6位為流水號。建立得到當前日期的檢視 create view v getdate asselect dt convert char 6 getdate 12 go 得到新編號的函式 create function f nextbh ...