-1

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

BK/201304/0002

BK : Just Inisialisation
2013 : is a year
04 : Month
0002 : is increment and back if the month is changed

谢谢

4

1 回答 1

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
于 2013-04-26T01:40:40.450 回答