Ich habe ein T-SQL
Skript, das einige Synchronisationslogik mit OUTPUT
Klausel in MERGE
s und INSERT
s implementiert.Mehrere OUTPUT-Klauseln in MERGE/INSERT/DELETE SQL-Befehle?
Jetzt füge ich eine Protokollierungsschicht hinzu und ich möchte eine zweite OUTPUT
Klausel hinzufügen, um die Werte in eine Berichtstabelle zu schreiben.
ich eine zweite OUTPUT
Klausel meiner MERGE
Anweisung hinzufügen:
MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code)
WHEN MATCHED AND T.IsDeleted = 0x0
THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET
THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action, inserted.Name, inserted.Code;
Und das funktioniert, aber solange ich versuchen, das Ziel
INTO @report_table;
ich die folgende Fehlermeldung hinzufügen vor INTO
:
A MERGE statement must be terminated by a semicolon (;)
ich fou nd a similar question here, aber es hat mir nicht weiter geholfen, weil die Felder, die ich einfügen werde, nicht zwischen zwei Tabellen überlappen und ich will die Arbeitssynchronisierungslogik (wenn möglich) nicht ändern.
UPDATE:
Nach der Antwort von Martin Smith ich eine andere Idee hatte, und wieder schrieb meine Frage, wie folgend:
INSERT INTO @report_table (action, name, code)
SELECT M.Action, M.Name, M.Code
FROM
(
MERGE TABLE_TARGET AS T
USING TABLE_SOURCE AS S
ON (T.Code = S.Code)
WHEN MATCHED AND T.IsDeleted = 0x0
THEN UPDATE SET ....
WHEN NOT MATCHED BY TARGET
THEN INSERT ....
OUTPUT inserted.SqlId, inserted.IncId
INTO @sync_table
OUTPUT $action as Action, inserted.Name, inserted.Code
) M
Leider hat dieser Ansatz nicht funktionieren, wird die folgende Fehlermeldung Ausgabe zur Laufzeit:
An OUTPUT INTO clause is not allowed in a nested INSERT, UPDATE, DELETE, or MERGE statement.
Also, es gibt definitiv keine Möglichkeit, mehrerezu habenKlauseln in einer einzelnen DML-Anweisung.
Ja, ich sah dies auf MSDN, aber ich hoffte, dass es einen Hack geben würde, um diese Einschränkung zu überwinden. Wie auch immer, danke, dass du darauf hingewiesen hast! –
Ich würde hinzufügen, dass Sie müssen die Ausgabe-Into kommen zuerst VOR der Ausgabe (genau wie Ihre Grammatik Klammern zeigen). Ich erwähne das nur für den Fall, dass jemand in der falschen Reihenfolge ist und nicht versteht, warum es nicht für sie funktioniert. – MikeTeeVee
Es ist möglich, 'MERGE' in die gespeicherte Prozedur einzubinden und' INSERT ... EXEC' zu verwenden, um das Ergebnis des zweiten 'OUTPUT' in eine zweite Tabelle einzufügen, wie ich in meiner Antwort gezeigt habe. Es hat seine Schattenseiten, kann aber in bestimmten Fällen nützlich sein. –