如何在组合年份的sql server中生成自动编号

时间:2013-04-26 01:22:14

标签: .net sql-server vb.net sql-server-2008 sql-server-2005

我想在sql server中制作这样的自动编号

BK / 201304/0002

BK:Just Inisialisation
2013年:是一年 04:月
日 0002:如果月份发生变化,则会增加并再次返回

感谢

1 个答案:

答案 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