我们正在进行DB2迁移到SQL Server,并且我们需要迁移许多BEFORE插入/更新。我们可以通过简单地使用命令“INSERT INTO TableName SELECT * FROM inserted”来简单地使用INSTEAD OF INSERT来处理插入。
但是,对于更新而言,它更难以执行像“UDPATE TableName SELECT * FROM Inserted”这样的命令。相反,我们找到的唯一选项是为每个传入列声明变量,然后使用UPDATE TableName SET ColumnName = @ col1等中的那些。不幸的是,这会导致相当多的手动工作,我想找到一个更自动化的解决方案。
一些问题: 1)有没有办法可以在不知道具体列信息的情况下使用触发器插入来发布更新? 2)有没有办法在触发器中编写一个循环来自动逐步插入插入的列,并将其更新到数据库中? 3)有没有办法访问导致触发器的原始命令?所以我可以做一个EXEC @command并以这种方式处理事情?
非常感谢任何帮助!
谢谢! 鲍勃
答案 0 :(得分:0)
UPDATE
sys.columns
中)并动态构建UPDATE
语句,但动态SQL在其自己的范围内执行,因此它无法访问直接inserted
和deleted
表。虽然您可以先将数据复制到本地临时表(#inserted
)来解决这个问题,但这似乎是一种非常尴尬的方法UPDATE
声明但我不确定你真正想要实现的目标。您的问题意味着触发器无需修改任何数据即可执行原始INSERT
或UPDATE
。如果确实如此,您可能想要解释触发器的用途是什么,因为可能有一种替代的,更简单的方法来做它正在做的事情。
我也对你的陈述感到有点困惑,你必须“为每个传入列声明变量,然后使用UPDATE TableName SET ColumnName = @col1
等中的变量”。 SQL Server中的触发器每个语句总是触发一次,因此您通常会执行UPDATE
with a join来处理UPDATE
多行的情况。
您可能还会发现UPDATE()
或COLUMNS_UPDATED()
函数可用于限制触发器代码,以便仅处理真正更新的列。