我想像这样在sql server中制作自动编号
BK/201304/0002
BK : Just Inisialisation
2013 : is a year
04 : Month
0002 : is increment and back if the month is changed
谢谢
我想像这样在sql server中制作自动编号
BK/201304/0002
BK : Just Inisialisation
2013 : is a year
04 : Month
0002 : is increment and back if the month is changed
谢谢
下面的解决方案假设您已经有一个序列表。序列或数字表只是一个(一列)具有递增数字的表。
select 'BK/'
+ cast(year(getdate()) as varchar)
+ right('00' + cast(month(getdate()) as varchar), 2)
+ '/'
+ right('0000' + cast(isnull((select max(Seq) + 1 from SequenceTable), 0) as varchar), 4)
如果您还没有,请告诉我。我将更新我的答案以包括一个给你。
更新 - 包含 SequenceTable 的代码。
create table SequenceTable
(
Seq int not null identity(1, 1)
)
create proc dbo.IncrementSeq
as
set nocount on
if day(getdate()) = 1
truncate table SequenceTable -- Reset
else
insert SequenceTable default values -- Increment
return 0
go
我开始做出很多假设,这让我很不舒服。上面的代码假定您可以在生成自动序列号之前调用存储过程。如果是这种情况,您甚至可以将我的所有代码作为一个步骤包含在存储过程中。请参见下面的代码:
create proc dbo.IncrementSeq
as
set nocount on
if day(getdate()) = 1
truncate table SequenceTable -- Reset
else
insert SequenceTable default values -- Increment
select 'BK/'
+ cast(year(getdate()) as varchar)
+ right('00' + cast(month(getdate()) as varchar), 2)
+ '/'
+ right('0000' + cast(isnull((select max(Seq) + 1 from SequenceTable), 0) as varchar), 4)
return 0
go
更新 - 为了完整性和简单性,我改进了我的答案。
create table SequenceTable
(
Seq varchar(max) not null
)
insert SequenceTable
select 'BK/'
+ cast(year(Getdate()) as varchar)
+ right('00' + cast(month(getdate()) as varchar), 2)
+ '/'
+ case when day(getdate()) = 1 then '0000'
else right('0000' + cast(isnull((select right(max(Seq), 4) + 1 from SequenceTable), 0) as varchar), 4)
end