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

Sql server 如何获取触发器中“仅更新列”的名称?,sql-server,triggers,Sql Server,Triggers,我想从触发器内部打印“仅更新列”的名称 例如,我的表有三列——ColA、ColB和ColC 如果我只更新ColB,我的触发器应该只打印ColB 如果我只更新可乐和可乐,我的触发器应该只打印可乐和可乐 我可以知道如何以一种更短更干净的方式做到这一点吗?就我个人而言,我讨厌触发器,并且在大多数时候尽量避免它们- 但是,我知道的唯一方法是在触发器代码中更新函数列。另请参见以下示例:此网站帮助了我- 成功了。请在LinqPad中试用。如果键入->SQL SERVER如何确定触发器中哪些列被更新到goog

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

例如,我的表有三列——ColA、ColB和ColC

如果我只更新ColB,我的触发器应该只打印ColB

如果我只更新可乐和可乐,我的触发器应该只打印可乐和可乐


我可以知道如何以一种更短更干净的方式做到这一点吗?

就我个人而言,我讨厌触发器,并且在大多数时候尽量避免它们-

但是,我知道的唯一方法是在触发器代码中更新函数列。另请参见以下示例:

此网站帮助了我-


成功了。请在LinqPad中试用。

如果键入->SQL SERVER如何确定触发器中哪些列被更新到google中,您可能会对返回的第一个链接感兴趣我检查了它。这是有用的。谢谢,不是为我工作。如果有许多列,则出现溢出异常。这项工作可以看到所有答案:
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