Sql server 2008 MERGE – beste path, um zu kommen

Ich frage mich, was y'alls empfehlen würde, als der beste path, um über die Aktion zählt aus einer MERGE-statement in Sql server zu gehen.

Also, dh ich laufe eine MERGE, die einige Einsätze, einige Updates und einige löscht, … Ich möchte in der Lage sein, herauszufinden, WIE VIELE Einsätze, WIE VIELE Updates und wie viele löscht.

Was wäre der beste path, dies zu tun?

Sie können eine OUTPUT-Klausel auf Ihrer MERGE-statement angeben und einen Ausgabestatus erhalten, was während der MERGE getan wurde.

MERGE (targetTable) AS t USING (sourceTable) AS s ON t.ID = s.ID WHEN MATCHED THEN (some statements) WHEN NOT MATCHED THEN (some statements) OUTPUT $action, inserted.ID 'inserted', deleted.ID 'deleted' ; 

Dies gibt Ihnen eine Zeile für jede "Aktion" (insert, aktualisieren, löschen) für jede Operation. Wenn es eine Menge Aussagen gibt, könntest du auch in @tableVar OUTPUT und dann die Tabellenvariable betrachten.

 DECLARE @tableVar TABLE (MergeAction VARCHAR(20), InsertedID INT, DeletedID INT) MERGE (targetTable) AS t USING (sourceTable) AS s ON t.ID = s.ID WHEN MATCHED THEN (some statements) WHEN NOT MATCHED THEN (some statements) OUTPUT $action, inserted.ID 'inserted', deleted.ID 'deleted' INTO @tableVar ; SELECT MergeAction, COUNT(*) FROM @tableVar GROUP BY MergeAction 

Schauen Sie sich die Books Online für Details über die MERGE- statement und die OUTPUT-Klausel an .

Marc

Um in einzelne Vars zu extrahieren, kann die Post Antwort von marc_s mit Pivot:

  declare @mergeResultsTable table (MergeAction VARCHAR(20)); declare @insertCount int, @updateCount int, @deleteCount int; merge ... output $action into @mergeResultsTable; select @insertCount = [INSERT], @updateCount = [UPDATE], @deleteCount = [DELETE] from (select 'NOOP' MergeAction -- row for null merge into null union all select * from @mergeResultsTable) mergeResultsPlusEmptyRow pivot (count(MergeAction) for MergeAction in ([INSERT],[UPDATE],[DELETE])) as mergeResultsPivot; 

Die Union 'noop' Zeile kann entfernt werden, wenn init vars auf 0 oder wissen, dass Quell- oder Zieltabelle> 0 Zeilen hat.

Wie wäre es mit:

 INSERT YourResultsTable (action, cnt) SELECT action, count(*) FROM ( MERGE (targetTable) AS t USING (sourceTable) AS s ON t.ID = s.ID WHEN MATCHED THEN (some statements) WHEN NOT MATCHED THEN (some statements) OUTPUT $action as action, inserted.ID as ins, deleted.ID as del ) m GROUP BY action; 

[Bearbeiten] Ok, also versuch:

 INSERT YourResultsTable (action) SELECT action FROM ( MERGE (targetTable) AS t USING (sourceTable) AS s ON t.ID = s.ID WHEN MATCHED THEN (some statements) WHEN NOT MATCHED THEN (some statements) OUTPUT $action as action, inserted.ID as ins, deleted.ID as del ) m; 

(und dann die Ergebnisse zählen)

rauben