1

我们正在将 DB2 迁移到 SQL Server,并且需要迁移许多 BEFORE 插入/更新。我们可以通过简单地使用命令“INSERT INTO TableName SELECT * FROM inserted”来使用 INSTEAD OF INSERT 来非常简单地处理插入。

但是,对于更新,它更难,因为您不能只执行“UDPATE TableName SELECT * FROM Inserted”之类的命令。相反,我们发现的唯一选择是为每个传入列声明变量,然后在UPDATE TableName SET ColumnName = @col1, etc. 不幸的是,这会导致相当多的手动工作,我想找到一个更自动化的解决方案。

一些问题:1)有没有一种方法可以在不知道特定列信息的情况下使用从触发器中插入来发出更新?
2) 有没有办法在触发器中编写一个循环,自动单步执行插入的列,并将这些列更新到数据库?3)有没有办法访问导致触发器的原始命令?所以我可以执行 EXEC @command 并以这种方式处理事情吗?

任何帮助将不胜感激!

谢谢!鲍勃

4

1 回答 1

0
  1. 您必须在UPDATE
  2. 您可以遍历目标表 (in sys.columns) 的元数据并动态构建UPDATE语句,但动态 SQL 在其自己的范围内执行,因此无法直接访问inserteddeleted表。尽管您可以通过首先将数据复制到本地临时表 ( #inserted) 来解决此问题,但总的来说,这似乎是一种非常尴尬的方法
  3. 无法访问原始UPDATE语句

但我不确定你真正想要达到的目标。您的问题意味着触发器执行原始操作INSERTUPDATE无论如何都不会修改任何数据。如果情况确实如此,您可能需要解释触发器的目的是什么,因为可能有另一种更简单的方法来做它正在做的任何事情。

我也对您的声明感到有些困惑,即您必须“为每个传入列声明变量,然后在UPDATE TableName SET ColumnName = @col1等 中使用这些变量”。SQL Server 中的触发器总是每条语句触发一次,因此您通常UPDATE使用连接来处理UPDATE多行的情况。

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

于 2013-04-08T21:52:05.303 回答