Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在SQLServer触发器中获取更新列的列表?_Sql Server 2005_Triggers - Fatal编程技术网

Sql server 2005 如何在SQLServer触发器中获取更新列的列表?

Sql server 2005 如何在SQLServer触发器中获取更新列的列表?,sql-server-2005,triggers,Sql Server 2005,Triggers,我想知道在第一个Scaning books online的触发器上的更新操作中更新了哪些列。看起来更新的列是完美的解决方案,但该函数实际上不检查值是否已更改,它只检查在更新子句中选择了哪些列,有人有其他建议吗?我能想到的唯一方法是,您可以比较“删除”和“插入”中的值,以查看哪些列已更改 但这似乎不是一个特别优雅的解决方案。检查值是否已更改的唯一方法是比较触发器中已删除和插入的虚拟表中的值。SQL在更新到新值之前不会检查现有值,它会很高兴地在顶部写入一个新的相同值-换句话说,它接受您的更新并跟踪更

我想知道在第一个Scaning books online的触发器上的更新操作中更新了哪些列。看起来更新的列是完美的解决方案,但该函数实际上不检查值是否已更改,它只检查在更新子句中选择了哪些列,有人有其他建议吗?

我能想到的唯一方法是,您可以比较“删除”和“插入”中的值,以查看哪些列已更改


但这似乎不是一个特别优雅的解决方案。

检查值是否已更改的唯一方法是比较触发器中已删除和插入的虚拟表中的值。SQL在更新到新值之前不会检查现有值,它会很高兴地在顶部写入一个新的相同值-换句话说,它接受您的更新并跟踪更新,而不是实际的更改。

我问


前面的海报是正确的——如果不直接比较这些值,就无法确定数据是否确实发生了更改。但是,有几种方法可以执行这种类型的检查,具体取决于您在触发器中尝试执行的其他操作。我的问题在回答这些不同机制及其权衡方面有一些很好的建议。

正如其他人所发布的,您需要询问插入和删除。唯一其他有用的建议可能是,通过使用EXCEPT运算符,您只能获取已更改值的行(并丢弃未更改的行),如下所示:

SELECT * FROM Inserted
EXCEPT
SELECT * FROM Deleted

我们可以使用Update函数查找特定列是否已更新:

IF UPDATE(ColumnName)
有关详细信息,请参阅此链接: