【问题标题】:How to get names of the 'only updated columns' in a trigger?如何在触发器中获取“仅更新的列”的名称?
【发布时间】:2019-06-24 01:41:32
【问题描述】:

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

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

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

如果我只更新 ColA 和 ColC,我的触发器应该只打印 ColA 和 ColC。

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

【问题讨论】:

  • 如果您在 google 中键入 -->“SQL SERVER 如何确定触发器内更新了哪些列”,您可能会对返回的第一个链接感兴趣
  • dev.to/ravenous_baboon/… 我查过了。这很有用。谢谢。

标签: sql-server triggers


【解决方案1】:

这个网站帮助了我 - 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 中试用。

【讨论】:

【解决方案2】:

就我个人而言,我讨厌触发器并尽量避免它们;-)

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

【讨论】:

    猜你喜欢
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多