在 SQL 的触发中 
   我有一个TABLE_ONE
    TABLE_ONE 有  ID ,NAM, PP三个字段
    我在
     NAM 中的管理触发器中建了一个这样的触发器
   
    CREATE TIGGER TIG_TEST dbo.TABLE_ONE
    AFTER UPDATE 
    AS 
      IF UPDATE(NAM)
        UPDATE TABLE_ONE SET PP='TEST' WHERE 
          ID=    (这个地方如何得到当前所在行的ID

解决方案 »

  1.   

    update a set PP = 'TEST' from TABLE_ONE a 
    inner join inserted i on a.id = i.id
      

  2.   

    CREATE TIGGER TIG_TEST dbo.TABLE_ONE
        AFTER UPDATE 
        AS 
          IF UPDATE(NAM)
            UPDATE TABLE_ONE SET PP='TEST' 
            from inserted i,TABLE_ONE t
             WHERE 
              t.ID=i.id
      

  3.   

    我测试了一下,两位都是正确的,但都不明白种表写法
    update a set PP = 'TEST' from TABLE_ONE a 
    inner join inserted i on a.id = i.id或 UPDATE TABLE_ONE SET PP='TEST' 
            from inserted i,TABLE_ONE t
             WHERE 
              t.ID=i.id
    能解释一下吗
      

  4.   

    这二种写法的实质是相同的,都是内联,只是写法不同而已.
    update触发器中,被修改的行同时被添加到inserted表和deleted表两个特殊表中,inserted表中是被修改后的行,deleted表中是被修改前的行.
    批量更新时(如使用update table set column = value不加where条件限制时)inserted表中会有多行而不是一行,所以必须与inserted表或deleted表inner join来定位这些被修改的行在基表中的位置,以准确无误地更新基表中的列.
      

  5.   

    楼主可以在触发器中加入
    select * from inserted
    select * from deleted
    来测试一下,观察这二个表之间的变化.
      

  6.   

    inserted和deleted是两个逻辑(概念)表,前者当为insert插入操作时表明要插入的值,当为update操作时是新值,dletdd