SQL更新/删除触发器工作不正常

SQL更新/删除触发器工作不正常,sql,triggers,Sql,Triggers,我有一个触发器,用于审核插入、更新和删除的行。我在从触发器获取旧值和新值时遇到问题。触发器利用一个循环来插入以任何方式更改(插入、更新、删除)的任何行的所有值。但是,我的代码并没有返回值,而是返回列名作为值 以下是我的部分代码: SELECT @COLNAME = NAME FROM SYSCOLUMNS WHERE COLID = @FIELD AND ID = (SELECT ID FROM SYSOBJECTS WHERE NAME = 'FIN_HOTEL_DTL_TYPE'

我有一个触发器,用于审核插入、更新和删除的行。我在从触发器获取旧值和新值时遇到问题。触发器利用一个循环来插入以任何方式更改(插入、更新、删除)的任何行的所有值。但是,我的代码并没有返回值,而是返回列名作为值

以下是我的部分代码:

SELECT @COLNAME = NAME 
FROM SYSCOLUMNS 
WHERE COLID = @FIELD AND
    ID = (SELECT ID FROM SYSOBJECTS WHERE NAME = 'FIN_HOTEL_DTL_TYPE') 
SELECT @OLDVAL = SUBSTRING(@COLNAME, 2, LEN(@COLNAME)) FROM DELETED 
SELECT @NEWVAL = SUBSTRING(@COLNAME, 2, LEN(@COLNAME)) FROM INSERTED 
SELECT @MODBY = MODIFIED_BY FROM INSERTED 
SELECT @MODDT = MODIFIED_DATETIME FROM INSERTED 

T-SQL只是一个不同的世界

您的代码完全按照您的要求执行@ColName不是对column对象的引用,而是一个包含字符串值的变量,该字符串值是用列的名称加载的

我建议你看一本书。如果你愿意,可以通读整本书,但是如果你很匆忙,可以直接用短语createtrigger-Audit

另外,请花点时间使用基于集合的逻辑执行此操作-如示例中所示。通过使用T-SQL和打破逐行编码的束缚,利用DBMS的能力和性能。不,真的。编码循环=性能差。如果需要,DBMS将在后台实现循环(或者按照自己的意愿)

祝你好运



我之前试图找到这个链接。我相信Paul Nielsen的作品非常接近你想要的。

是的,我对@ColName也有同样的想法。我之所以使用这种类型的逻辑,是因为有些表有大量的列(很遗憾,传统数据库不是我的选择),我不想对每一列进行编码。答案很好,特别是关于避免在循环中这样做的部分。我已经实现了类似的触发器,它们在没有循环的情况下更短、更简单,而且性能更好。谢谢您的帮助。我取出循环,简单地分别引用列。