我的合并看起来像这样:
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
值为一行。
我的第一次尝试是使用OUTPUT
和OUTPUT 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
答案 0 :(得分:1)
在输出语句中包括“已插入列”和“已删除列”。
AppendOnlyStringBuilder
然后执行Unpivot或Cross Apply将列链接到新旧值。