首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止使用OUTPUT的SQL Server合并更新目标表

问如何防止使用OUTPUT的SQL Server合并更新目标表
EN

Stack Overflow用户
提问于 2019-11-01 22:01:32
回答 1查看 35关注 0票数 1

我知道如何使用SQL server MERGE语句从源表更新目标表。我知道我可以使用一个OUTPUT语句来捕获这些变化。

问题:当使用output语句捕获更改时,它们仍然应用于目标表。

问:如何防止MERGE语句更新目标并仅捕获输出?

额外信息:本例中的目标不是审计,这是MERGE中常用的输出语句。目标是确定更改,然后对无法添加到合并中的更改进行进一步处理。你也可以称之为演练。

EN

回答 1

Stack Overflow用户

发布于 2019-11-01 22:25:15

为了让MERGE发出任何内容作为OUTPUT子句的一部分,它必须执行UPDATE或INSERT。

在我的脑海中,我可以看到两种实现你想要的东西的方法:

第一:编写一些SQL来捕获馈送到MERGE语句中的数据集,并使用它来确定MERGE将执行什么操作。我知道我没有很好地解释这一点,所以这里有一个使用伪代码的示例。

代码语言:javascript
复制
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时,我通常会通过在事务中包装一些东西,然后拥有以下内容来实现:

代码语言:javascript
复制
SELECT 1 / 0

触发回滚。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58660512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档