我知道如何使用SQL server MERGE语句从源表更新目标表。我知道我可以使用一个OUTPUT语句来捕获这些变化。
问题:当使用output语句捕获更改时,它们仍然应用于目标表。
问:如何防止MERGE语句更新目标并仅捕获输出?
额外信息:本例中的目标不是审计,这是MERGE中常用的输出语句。目标是确定更改,然后对无法添加到合并中的更改进行进一步处理。你也可以称之为演练。
发布于 2019-11-01 22:25:15
为了让MERGE发出任何内容作为OUTPUT子句的一部分,它必须执行UPDATE或INSERT。
在我的脑海中,我可以看到两种实现你想要的东西的方法:
第一:编写一些SQL来捕获馈送到MERGE语句中的数据集,并使用它来确定MERGE将执行什么操作。我知道我没有很好地解释这一点,所以这里有一个使用伪代码的示例。
SELECT
s.*
,d.PrimaryKey
INTO
#SourceForMerge
FROM
[Source] AS s
LEFT OUTER JOIN [Destination] AS d
ON s.MatchingColumnA = d.MatchingColumnA
AND s.MatchingColumnB = d.MatchingColumnB
;MERGE [Destination] AS d
USING
(
SELECT * FROM #SourceForMerge
) AS s
ON
d.PrimaryKey = s.PrimaryKey
WHEN MATCHED THEN
-- UPDATE columns
WHEN NOT MATCHED THEN
-- INSERT columns
OUTPUT
-- columns
INTO
#OutputTempTable这将允许您查询#SourceForMerge临时表,以查看哪些匹配,哪些不匹配。
或者,您也可以将合并包装在一个事务中,捕获输出,选择它,然后故意回滚以“撤消”更改。
这在我看来是最准确的方法,但也有点吓人。
当我测试一些SQL时,我通常会通过在事务中包装一些东西,然后拥有以下内容来实现:
SELECT 1 / 0触发回滚。
https://stackoverflow.com/questions/58660512
复制相似问题