如何在触发器中获取“仅更新的列”的名称?

时间:2019-01-30 17:30:52

标签: sql-server triggers

我想从触发器内部打印“仅更新的列”的名称。

例如,我的表有三列-ColA,ColB和ColC。

如果仅更新ColB,则触发器应仅打印ColB。

如果仅更新ColA和ColC,则触发器应仅打印ColA和ColC。

我可以知道如何以更短,更清洁的方式实现这一目标吗?

2 个答案:

答案 0 :(得分:0)

我个人讨厌触发器,并在大多数情况下尽量避免使用它们;-)

但是,我唯一知道的方法是在触发器代码中使用COLUMNS_UPDATED()函数。另请参见示例:https://sites.google.com/site/bugsarewelcome/home/columns_updated

答案 1 :(得分:0)

该网站帮助了我-https://ask.sqlservercentral.com/questions/44368/columns-updated-not-returning-the-column-name.html

create table Sample1
(
    a varchar(10),
    b varchar(10),
    c varchar(10)
);

alter trigger TR_Sample1_Update ON Sample1 for update as 
DECLARE @modifiedColumns nvarchar(max) 
SET @modifiedColumns = STUFF((SELECT ',' + name FROM sys.columns WHERE object_id = OBJECT_ID('Sample1') AND COLUMNS_UPDATED() & (POWER(2, column_id - 1)) <> 0 FOR XML PATH('')), 1, 1, '') 
PRINT @modifiedColumns
go

update Sample1 set a = 1 where a = 1
update Sample1 set b = 4 where a = 1
update Sample1 set c = 5 where a = 1
update Sample1 set a = 1, c = 5 where a = 1
update Sample1 set a = 1, b = 4, c = 5 where a = 1

有效。请在LinqPad中尝试。