日期:2014-05-18  浏览次数:20475 次

请教触发器的写法
我有个表“Persons”,有如下字段:
自动编号:ID;
录入日期:P_Date;
姓名:P_Name;
证件编号:P_NO。

其中“P_NO”编号字段为防止多个客户端同时录入造成重复,我想让这个字段通过触发器来自动生成。
这个字段这样定义:按照录入日期(取8位,如20120426)+ 三位数字来生成(每天录入的记录不会超过1000),从001开始,自动加1,例如:如果录入日期为2012年3月8日,则当天第一个编号为20120308001,第二个为20120308002,……。

P_NO字段一经生成则不能修改。

请问这个触发器应该怎么写?谢谢!



------解决方案--------------------
SQL code

--使用一个序号管理表,管理每天的序号
create table IndexManager
(
  [Date] varchar(8),
  px int 
)

create table Persons(
 id int identity(1,1),
 P_Date datetime,
 P_Name nvarchar(10),
 P_NO varchar(11)

)  



create trigger tr_Persons_Insert on Persons 
for insert
AS
begin
  declare @id int
  declare @px int
  declare @today varchar(8)
  select @today =replace(CONVERT (varchar(10),GETDATE(),120),'-','')
  
  IF EXISTS(select 1 from IndexManager where [Date]=@today)
      begin
         update IndexManager set px=px+1 where [Date]=@today   --如果当天记录存在,则先更新,后取出
         select @px=px from IndexManager where [Date]=@today
      end
  else
    begin
     insert into IndexManager([Date],px) values(@today,1) --如果当天记录不存在,则先插入,后取出
     select @px=px from IndexManager where [Date]=@today
    end
    
   select @id=id from inserted
   update Persons set P_NO=@today + right('000' + cast(@px as varchar),3) where id=@id
  
end

insert into Persons(P_Date,P_Name)values(getdate(),'张三1' )
select * from Persons
insert into Persons(P_Date,P_Name)values(getdate(),'张三2' )
select * from Persons