使用MERGE的多个OUTPUT

时间:2015-07-10 16:47:31

标签: sql-server merge

我的合并看起来像这样:

MERGE INTO TARGET_TABLE AS t
USING SOURCE_TABLE AS s
    ON t.LOCAL_ID = s.LOCAL_ID
WHEN MATCHED
    AND (
        t.[col1] <> s.[col1]
        OR t.[col2] <> s.[col2]
        OR t.[col5] <> s.[col5]
        )
    THEN
        UPDATE
        SET [col1] = s.[col1]
            ,[col2] = s.[col2]
            ,[col5] = s.[col5]
WHEN NOT MATCHED BY TARGET
    THEN
        INSERT (
            [LOCAL_ID]
            ,[col1]
            ,[col2]
            ,[col5]
            )
        VALUES (
            s.[LOCAL_ID]
            ,[col1]
            ,[col2]
            ,[col5]
            )
WHEN NOT MATCHED BY SOURCE
    THEN
        DELETE
OUTPUT GetDate()
    ,s.LOCAL_ID
    ,$ACTION
    ,deleted.[col1] col1
    ,deleted.[col2] col2
    ,deleted.[col5] col5
    ,inserted.[col1] NEW_col1
    ,inserted.[col2] NEW_col2
    ,inserted.[col5] NEW_col5
INTO [AUDIT];

将一行推入我的AUDIT表中,如下所示:

LOCAL_ID ACTION col1 col2 col5 NEW_col1 NEW_col2 NEW_col5

有一些演示值:

123 UPDATE foo bar foobar FOO BAR FOOBAR

但是我真的喜欢它像

123 UPDATE NEW FOO BAR FOOBAR
123 UPDATE OLD foo bar foobar

合并输出的deleted值为一行,inserted值为一行。

我的第一次尝试是使用OUTPUTOUTPUT INTO,然后使用INSERT包装它(请参阅Multiple OUTPUT clauses in MERGE/INSERT/DELETE SQL commands?),但SQL服务器说我无法执行此操作错误An OUTPUT INTO clause is not allowed in a nested INSERT, UPDATE, DELETE, or MERGE statement.

有关如何实现我想要的而不会变得非常混乱的任何建议? 我希望较新的SQL服务器软件以某种方式解决这个问题。我正在使用SQL SERVER Enterprise 2012

1 个答案:

答案 0 :(得分:1)

在输出语句中包括“已插入列”和“已删除列”。

AppendOnlyStringBuilder

然后执行Unpivot或Cross Apply将列链接到新旧值。