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)
我觉得很奇怪,请你帮忙.
无论是否奇怪,至少记录在案:
警告
在SQL Server 2008中,INFORMATION_SCHEMA.COLUMNS视图的ORDINAL_POSITION列与COLUMNS_UPDATED返回的列的位模式不兼容.若要获取与COLUMNS_UPDATED兼容的位模式,请在查询INFORMATION_SCHEMA.COLUMNS视图时引用COLUMNPROPERTY系统函数的ColumnID属性,如以下示例所示.
Run Code Online (Sandbox Code Playgroud)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';
如果列被引用,UPDATE() 将返回 true,如果值没有改变也没关系
所以如果你这样做
update table BLa
set Col1 = Col1
Run Code Online (Sandbox Code Playgroud)
在触发器中 UPDATE() 将为该列返回 true
触发器中的联接inserted和deleted伪表并检查值是否未更改,当然还要确保考虑 NULL...
| 归档时间: |
|
| 查看次数: |
6969 次 |
| 最近记录: |