十年

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
        今天一朋友提到在sql server數據庫中如何利用觸發器實現如“2005A001、2005A002、2005B001、2005C001。。。”這樣的自動編號。
        朋友有難,豈能不救,也好借機會顯示一下什麼才是真正的高手。(哈,玩笑而已)
        首先說明一下,編號中的前四位表示目前年份,第五位(A、B、C...)為類別標識,在表中有這字段(flag char(1) not null),後三位為流水號。
        明白了需求,程序編寫也就容易了。親增時首先應取得表中該類的最大流水號,加1後即為親的流水號,然後取得年份,與類別相連,就得到了親的ID號了。
        觸發器源建立在表名為mytest的表內,表結構的sql描述如下:

CREATE TABLE [dbo].[mytest] (
    
[id] [varchar] (8NOT NULL ,
    
[sname] [varchar] (12NULL ,
    
[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),3from 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
posted on 2005-01-13 09:53  留不住的时光  阅读(1762)  评论(5编辑  收藏  举报