如何在一个触发器中执行原始命令

时间:2013-04-08 15:55:09

标签: sql-server triggers

我们正在进行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并以这种方式处理事情?

非常感谢任何帮助!

谢谢! 鲍勃

1 个答案:

答案 0 :(得分:0)

  1. 您必须在UPDATE
  2. 中指定列名称
  3. 您可以循环遍历目标表的元数据(在sys.columns中)并动态构建UPDATE语句,但动态SQL在其自己的范围内执行,因此它无法访问直接inserteddeleted表。虽然您可以先将数据复制到本地临时表(#inserted)来解决这个问题,但这似乎是一种非常尴尬的方法
  4. 无法访问原始UPDATE声明
  5. 但我不确定你真正想要实现的目标。您的问题意味着触发器无需修改任何数据即可执行原始INSERTUPDATE。如果确实如此,您可能想要解释触发器的用途是什么,因为可能有一种替代的,更简单的方法来做它正在做的事情。

    我也对你的陈述感到有点困惑,你必须“为每个传入列声明变量,然后使用UPDATE TableName SET ColumnName = @col1等中的变量”。 SQL Server中的触发器每个语句总是触发一次,因此您通常会执行UPDATE with a join来处理UPDATE多行的情况。

    您可能还会发现UPDATE()COLUMNS_UPDATED()函数可用于限制触发器代码,以便仅处理真正更新的列。