我有一个触发器,用于审核插入,更新和删除的行。我遇到了从触发器获取旧值和新值的问题。触发器利用循环插入以任何方式(插入,更新,删除)更改的任何行的所有值。但是,我的代码不返回值,而是返回列名作为值。
以下是我的代码的一部分:
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
答案 0 :(得分:3)
T-SQL只是一个不同的世界。
您的代码完全按照您的要求执行操作。 @ColName不是对列对象的引用,而是一个包含已使用列名加载的字符串值的变量。
我建议您查看example。如果您愿意,请阅读整篇文章,但如果您赶时间,请下载“CREATE TRIGGER Audit”一词。
另外,花时间使用基于集合的逻辑执行此操作 - 如示例中所示。通过利用T-SQL并放弃逐行编码的绑定来利用DBMS的功能和性能。不完全是。编码循环=性能不佳。如果需要,DBMS将在后台实现循环(或者它希望)。
祝你好运!我之前试图找到此链接。我相信Paul Nielsen的this posting非常接近你想要的。