使用編號表按日期生成流水號的示例 sql

2022-02-11 20:47:48 字數 3246 閱讀 3230

--編號表

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 ...