今天一朋友提到在sql server數據庫中如何利用觸發器實現如“2005A001、2005A002、2005B001、2005C001。。。”這樣的自動編號。
朋友有難,豈能不救,也好借機會顯示一下什麼才是真正的高手。(哈,玩笑而已)
首先說明一下,編號中的前四位表示目前年份,第五位(A、B、C...)為類別標識,在表中有這字段(flag char(1) not null),後三位為流水號。
明白了需求,程序編寫也就容易了。親增時首先應取得表中該類的最大流水號,加1後即為親的流水號,然後取得年份,與類別相連,就得到了親的ID號了。
觸發器源建立在表名為mytest的表內,表結構的sql描述如下:
觸發器代碼如下:
需要說明的是,如果表的字段有變化,也需更改觸發器字段列表。
bonny.wong
朋友有難,豈能不救,也好借機會顯示一下什麼才是真正的高手。(哈,玩笑而已)
首先說明一下,編號中的前四位表示目前年份,第五位(A、B、C...)為類別標識,在表中有這字段(flag char(1) not null),後三位為流水號。
明白了需求,程序編寫也就容易了。親增時首先應取得表中該類的最大流水號,加1後即為親的流水號,然後取得年份,與類別相連,就得到了親的ID號了。
觸發器源建立在表名為mytest的表內,表結構的sql描述如下:
CREATE TABLE [dbo].[mytest] (
[id] [varchar] (8) NOT NULL ,
[sname] [varchar] (12) NULL ,
[flag] [char] (1) NOT NULL
) ON [PRIMARY]
[id] [varchar] (8) NOT NULL ,
[sname] [varchar] (12) NULL ,
[flag] [char] (1) NOT NULL
) ON [PRIMARY]
觸發器代碼如下:
CREATE TRIGGER auto_id ON [dbo].[mytest]
Instead of INSERT
AS
declare @new_id varchar(8),
@new_no varchar(3),
@sname varchar(12),
@year varchar(4),
@flag char(1)
select @year=convert(varchar(4),year(getdate()))
select @sname=sname,@flag=flag from inserted
select @new_no=right('000'+convert(varchar(3),max(convert(int,right(id,3)))+1),3) from mytest where flag=@flag
if @new_no='' or @new_no is Null
select @new_no='001'
select @new_id=@year+@flag+@new_no
--if insert(id)
begin
insert into mytest (id,sname,flag)values(@new_id,@sname,@flag)
if @@rowcount=0
begin
raiserror('error',16,1)
rollback transaction
end
select id,sname,flag from mytest
end
Instead of INSERT
AS
declare @new_id varchar(8),
@new_no varchar(3),
@sname varchar(12),
@year varchar(4),
@flag char(1)
select @year=convert(varchar(4),year(getdate()))
select @sname=sname,@flag=flag from inserted
select @new_no=right('000'+convert(varchar(3),max(convert(int,right(id,3)))+1),3) from mytest where flag=@flag
if @new_no='' or @new_no is Null
select @new_no='001'
select @new_id=@year+@flag+@new_no
--if insert(id)
begin
insert into mytest (id,sname,flag)values(@new_id,@sname,@flag)
if @@rowcount=0
begin
raiserror('error',16,1)
rollback transaction
end
select id,sname,flag from mytest
end
需要說明的是,如果表的字段有變化,也需更改觸發器字段列表。
bonny.wong