我在桌面上有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)
我认为这很奇怪并请求你的帮助。
答案 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
在触发器中加入inserted
和deleted
个伪表并检查值是否未更改,当然也要确保考虑NULL ...