select * from deleted
union
select * from inserted

解决方案 »

  1.   

    一般是需要哪个字段就判断一下,比如IF UPDATE(FIELD_1) ....
      

  2.   

    改了那些个字段:在触发器可以用IF UPDATE (column)
    测试在指定的列上进行的 INSERT 或 UPDATE 操作。IF (COLUMNS_UPDATED()) 
    测试是否插入或更新了提及的列
    COLUMNS_UPDATED的判断比较复杂,最好你能自己仔细看帮助的说明。
      

  3.   

    我知道用
    IF UPDATE(column) 可判断某字段是否更新,但如果字段太多的话太麻烦,有没有更好的办法
      

  4.   

    一个例子:F. 使用 COLUMNS_UPDATED 测试 8 列以上
    如果必须测试影响到表中前 8 列以外的列的更新时,必须使用 UBSTRING 函数测试由 COLUMNS_UPDATED 返回的适当的位。下例测试影响 Northwind.dbo.Customers 表中的第 3、第 5 或第 9 列的更新。USE Northwind
    DROP TRIGGER  tr1
    GO
    CREATE TRIGGER tr1 ON Customers
    FOR UPDATE AS
       IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(3-1))
          + power(2,(5-1))) 
          AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(1-1)))
          ) 
       PRINT 'Columns 3, 5 and 9 updated'
    GOUPDATE Customers 
       SET ContactName=ContactName,
          Address=Address,
          Country=Country
    GO
      

  5.   

    谢谢 Yang_(扬帆破浪) !这样好象还是要每个字段都判断
    有没有什么方法能不用判断,直接查找出更新的字段?
      

  6.   

    非要看更新了哪个字段吗?
    在触发器里修改
    首先,通过select count(*) from syscolumns where id = objects_id(更新表)
    得到字段总数。
    建一个循环,用update(字段名)来逐一检查每个字段是否更改。
    if update(字段名)中字段名可能不好确认,那么可以:
    select 字段名=name from syscolumns where ......
    set 字段名语句 =if update('+字段名+')' .....
    exec sp_executesql 字段名语句