触发UPDATE()和COLUMNS_UPDATED()函数

时间:2011-09-01 20:52:56

标签: sql sql-server tsql

我在桌面上有AFTER UPDATE触发器。

我需要获得更改colomn的名称,以及它的新旧值。

对代码中的每一列执行语句UPDATE(column_name) - 错误的解决方案。但是我无法通过查询获得所有表格的名称

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = 'smth'

并在游标中动态获取UPDATE(@column_name)值。

当我在表中只更新一列时尝试使用COLUMNS_UPDATED()函数的同时,我有结果(值转换为int):

64 (Updated column with ORDINAL_POSITION = 31)
32 (Updated column with ORDINAL_POSITION = 30)
8 (Updated column with ORDINAL_POSITION = 29)
4 (Updated column with ORDINAL_POSITION = 28)
2 (Updated column with ORDINAL_POSITION = 27)
1 (Updated column with ORDINAL_POSITION = 26)
32768 (Updated column with ORDINAL_POSITION = 25)

我认为这很奇怪并请求你的帮助。

2 个答案:

答案 0 :(得分:5)

是否奇怪,这至少是documented

  

<强>注意

     

在SQL Server 2008中,INFORMATION_SCHEMA.COLUMNS视图的ORDINAL_POSITION列与COLUMNS_UPDATED返回的列的位模式不兼容。若要获取与COLUMNS_UPDATED兼容的位模式,请在查询INFORMATION_SCHEMA.COLUMNS视图时引用COLUMNPROPERTY系统函数的ColumnID属性,如以下示例所示。

SELECT TABLE_NAME, COLUMN_NAME,
    COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME),
    COLUMN_NAME, 'ColumnID') AS COLUMN_ID
FROM AdventureWorks2008R2.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Contact';

答案 1 :(得分:4)

如果引用了列,UPDATE()将返回true,如果值未更改则无关紧要

所以,如果你这样做

update table BLa
set Col1 = Col1
触发器中的

UPDATE()将为该列返回true

在触发器中加入inserteddeleted个伪表并检查值是否未更改,当然也要确保考虑NULL ...