触发UPDATE()和COLUMNS_UPDATED()函数

reg*_*rus 5 sql t-sql sql-server

我在表上有AFTER UPDATE触发器.

我需要得到改变colomn的名称,它是旧的和新的价值观.

UPDATE(column_name)用代码中的每一列做声明- 糟糕的解决方案.但我不能通过查询得到所有表colomns名称

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.Columns 
WHERE TABLE_NAME = 'smth'
Run Code Online (Sandbox Code Playgroud)

并在游标中动态获取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)
Run Code Online (Sandbox Code Playgroud)

我觉得很奇怪,请你帮忙.

And*_*y M 5

无论是否奇怪,至少记录在案:

警告

在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';
Run Code Online (Sandbox Code Playgroud)


SQL*_*ace 4

如果列被引用,UPDATE() 将返回 true,如果值没有改变也没关系

所以如果你这样做

update table BLa
set Col1 = Col1
Run Code Online (Sandbox Code Playgroud)

在触发器中 UPDATE() 将为该列返回 true

触发器中的联接inserteddeleted伪表并检查值是否未更改,当然还要确保考虑 NULL...