SQL Server合并函数-删除和输出已删除的不正常工作

3
我有一个使用合并功能来插入、更新和删除记录的标准脚本。然而,我在将已删除的结果输出到审计类型表时遇到了很多问题。当我对干净的目标表运行该过程时,尽管没有删除任何内容(此时仅向非审计表插入,这确实如预期发生),但在审计表中出现了所有的空值。在相同条件下,针对相同的干净目标表,如果我删除以下内容:
OUTPUT deleted.Column1, deleted.Column2 INTO Table_Audit (Column1, Column2)

并将其替换为:

OUTPUT $action, Inserted.*, Deleted.*

我看到实际上没有任何被删除的内容,这很奇怪,因为源表和目标表在两次运行中都是相同的,合并谓词也保持不变。第二个语句中操作列的所有记录都是插入记录,正如我们所期望的那样。唯一不同的是上面我刚提到的东西。你有什么想法吗?


我确实意识到一个临时解决方法是创建一个临时表,将OUTPUT $action,Inserted.*,Deleted.*的结果传递到该临时表中,并从那里填充审核表。然而,我想要实现的方式更加简洁并且应该可以工作。 - TechDawg270
1个回答

3
请看K示例
将合并语句放在子查询中,插入到审核表的插入语句中。确保其中一列为$action,并在外部where子句中过滤要插入的值,只插入已删除的行。

我没有考虑到 deleted.* 把更新和删除的操作混在一起。 - TechDawg270
@TechDawg270,问题不在于 deleted.*。输出子句为每个更改(插入/更新/删除)返回一行,在更新的情况下,您可以访问 inserted 中的新值和 deleted 中的旧值。 - Mikael Eriksson
但是我认为,由于 deleted.* 存在于 delete 语句中,它只知道触及已删除的行,就像输出 deleted.* 包含在 update 语句中时发生的情况一样。 - TechDawg270
@TechDawg270,“deleted”并不在删除语句中。它是输出语句的一部分,正如我所说,当您进行更新时,它也会被填充。输出语句将始终返回已以某种方式修改的行数。 - Mikael Eriksson
@MikaelEriksson,这是唯一的方法吗?我也遇到了这样一种情况,我只想从合并语句中输出已删除的记录。 - Jithin Shaji
1
@JithinShaji 这是我所知道的唯一方法。 - Mikael Eriksson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接