gw_subject
id  subject
01   木工
02   电工
03   水电工
…………
gw_address
id   address
01    北京
02    上海
03    广州
04    天津
…………
gw_enter
id  pici     address   subject    exam_number(varchar 50)
1   200706    广州      木工       200706030100001     
2   200706    北京      电工       200706010200001
3   200706    北京      电工       200706010200002
4   200706    北京      水电工     200706010300001
这里的exam_number的规则是:
pici   + address编号 + 类别编号 +5位顺序编号
200706      01           03        000001   
需要一个触发器。
当增加一条记录时,自动生成一个15位的exam_number。
并且当对里面的address或者subject作出变更的时候。
触发器也会捕捉到。并对后面的exam_number作出变更。

解决方案 »

  1.   

    CREATE trigger [dbo].[gw_enter_I]
    on   dbo.gw_enter
    for  Insert, UPDATE
    as
    declare @aa varchar(50)
    begin 
    select @aa=pici+gw_address.id+gw_subject.id+right(5,'00000'+Convert(nvarchar,inserted.id))
    from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join 
    gw_address on inserted.address=gw_subject.addressupdate gw_enter  set exam_number=@aa  from  gw_enter inner join inserted on gw_enter.id=inserted.idend
      

  2.   

    --如果修改address或者subject可能造成顺序号断号create trigger tr_gw_enter
    on gw_enter
    for insert,update
    as
    if update(pici) or update(address) or update(subject)
    update a
    set exam_number=a.pici+b.id+c.id+right('00000'+cast((select cast(right(max(exam_number),5) as int) from gw_enter where exam_number like a.pici+b.id+c.id+'%')+(select count(*) from inserted where pici=a.pici and address=a.address and subject=a.subject and id<=a.id) as varchar),5)
    from gw_enter a,inserted i,gw_address b,gw_subject c
    where a.id=i.id
    and a.address=b.address
    and a.subject=c.subjectgo
      

  3.   

    CREATE TRIGGER gw_enter_insert ON dbo.gw_enter
    FOR insert
    AS
    begin
      update gw_enter set gw_enter.exam_number = gw_enter.pici + b.id + c.id from gw_subject as b,gw_address as c,inserted as d where  gw_enter.subject = c.subject and gw_enter.address = b.address and gw_enter.id = d.id
    end
    CREATE TRIGGER gw_enter_insert ON dbo.gw_enter
    FOR update
    AS
    begin
      update gw_enter set gw_enter.exam_number = gw_enter.pici + b.id + c.id from gw_subject as b,gw_address as c,inserted as d where  gw_enter.subject = c.subject and gw_enter.address = b.address and gw_enter.id = d.id
    end
      

  4.   

    lwl0606(寒泉):
    不对啊。。
    测试不成功。
      

  5.   


    CREATE trigger [dbo].[gw_enter_I]
    on   dbo.gw_enter
    for  Insert, UPDATE
    as
    declare @aa varchar(50)
    begin 
    select @aa=pici+gw_address.id+gw_subject.id+right('00000'+Convert(nvarchar,inserted.id),5)
    from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join 
    gw_address on inserted.address=gw_address.address
    update gw_enter  set exam_number=@aa  from  gw_enter inner join inserted on gw_enter.id=inserted.id
    end修改一下
      

  6.   

    如果不考虑变更address与subject。
    只考虑写出exam_number。
    应该怎么写最简化?
      

  7.   

    INSERT INTO gw_enter (ID,pici,address,subject) VALUES ('8','200102',N'北京',N'电工')id         pici       address    subject    exam_number                                        
    ---------- ---------- ---------- ---------- -----------------------------------------
    8          200102     北京         电工         200102010200008(1 row(s) affected)
      

  8.   

    我知道这里考虑变更address与subject的话会很麻烦,因为这样要考虑修改以后的顺序问题。
      

  9.   

    lwl0606(寒泉)
    不知道你设置那些id数据类型的时候是设置的什么类型?
    全部都是vchar吗?
      

  10.   

    wenwenti11() ( ) 信誉:100    Blog   加为好友  2007-07-10 14:06:08  得分: 0  
     
     
       如果不考虑变更address与subject。
    只考虑写出exam_number。
    应该怎么写最简化?
      
     
    ----------------------------------------------
    触发器必须考虑一次操作多条记录的情况
    所以,就算不考虑变更address与subject的情况,触发器也要这么写,没有多少可以简化的
      

  11.   

    这里有一个问题。
    最后那个5位顺序编号的时候有点问题。
    不能直接取前面的ID。
    如果最开始的那条数据
    4   200706    北京      水电工     200706010300001
    如果取ID号的话就会变成200706010300004了。
    数据类型全部使用vchar。测试没多大的问题了。
    就是这里这个序号的问题。
      

  12.   

    哪位大侠再帮修改一下啊。
    按照
    CREATE trigger [dbo].[gw_enter_I]
    on   dbo.gw_enter
    for  Insert, UPDATE
    as
    declare @aa varchar(50)
    begin 
    select @aa=pici+gw_address.id+gw_subject.id+right('00000'+Convert(nvarchar,inserted.id),5)
    from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join 
    gw_address on inserted.address=gw_address.address
    update gw_enter  set exam_number=@aa  from  gw_enter inner join inserted on gw_enter.id=inserted.id
    end
    最后那个5位顺序编号的时候有点问题。
    不能直接取前面的ID。
    如果最开始的那条数据
    4   200706    北京      水电工     200706010300001
    如果取ID号的话就会变成200706010300004了。
    数据类型全部使用vchar。测试没多大的问题了。
    就是这里这个序号的问题。
      

  13.   

    晕哦
    你用inserted.id序号当然有问题了
      

  14.   

    Haiwer(海阔天空):
    那应该怎么写啊??
    按照你写的触发器,
    语法测试正常
    但是就是没法使用。提示什么错误。
      

  15.   

    抱歉,没仔细看
    alter trigger [dbo].[gw_enter_I]
    on   dbo.gw_enter
    for  Insert, UPDATE
    as
    declare @aa varchar(50)
    declare @id int
    begin 
    select @id=max(right(exam_number,5))  from  gw_enter  where subject =(select top 1  subject from  inserted)
    select @aa=pici+gw_address.id+gw_subject.id+right('00000'+Convert(nvarchar,isnull(@id,0)+1),5)
    from inserted inner join gw_subject on inserted.subject=gw_subject.subject inner join 
    gw_address on inserted.address=gw_address.address
    update gw_enter  set exam_number=@aa  from  gw_enter inner join inserted on gw_enter.id=inserted.id
    end
    +5位顺序编号
     是不是按subject 分类之后的编号?