我想从触发器内部打印“仅更新的列”的名称。
例如,我的表有三列-ColA,ColB和ColC。
如果仅更新ColB,则触发器应仅打印ColB。
如果仅更新ColA和ColC,则触发器应仅打印ColA和ColC。
我可以知道如何以更短,更清洁的方式实现这一目标吗?
答案 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中尝试。