我想在sql server中制作这样的自动编号
BK / 201304/0002
BK:Just Inisialisation
2013年:是一年
04:月
日
0002:如果月份发生变化,则会增加并再次返回
感谢
答案 0 :(得分:1)
下面的解决方案假设您已经有一个序列表。序列号或数字表只是一个带有递增数字的(一列)表。
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