2009-08-12 4 views
26

Мне интересно, что y'alls порекомендует как лучший способ получить счетчик действий из инструкции MERGE на Sql Server.Sql Server 2008 MERGE - лучший способ получить подсчет

Так, например, я запускаю MERGE, который выполняет некоторые вставки, некоторые обновления и некоторые удаления, ... Я хотел бы узнать, КАК МНОГО Вставить, КАК МНОГО обновлений и сколько удаляет.

Какой был бы лучший способ сделать это?

ответ

31

Вы можете указать предложение OUTPUT в своем заявлении MERGE и получить выходной отчет о том, что было сделано во время MERGE.

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' 
; 

Это даст вам строку для каждого «действия» (вставить, обновить, удалить) для каждой операции. Если много операторов, вы также можете ВЫХОДИТЬ В @tableVar, а затем посмотреть на переменную таблицы.

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 

Отъезд в Books Online подробно о MERGE заявления и OUTPUT clause.

Марк

+0

Возможно ли это как-то сделать в одном утверждении, возможно, с группой? так что выходной бит будет чем-то вроде строк> OUTPUT $ ACTION, COUNT (1) GROUP BY $ ACTION? – eidylon

+0

Нет, вы не можете этого сделать. Вы можете либо вывести OUTPUT в окно вывода SSMS, либо в переменную таблицы - не перетягивать предложение OUTPUT !! :-) –

+0

А хорошо ... На самом деле, OUTPUT выдает переменную таблицы или набор результатов? Можно ли обернуть оператор MERGE с помощью предложения OUTPUT внутри оператора SELECT в качестве источника (в качестве подзапроса), а затем, чтобы внешний SELECT выполнял агрегацию? ... Звучит возможно. Мне, возможно, придется поиграть с этим. – eidylon

1

Как насчет:

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; 

[Edit] Итак, попробуйте:

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; 

(а затем подсчитать результаты)

Роб

+0

Nope: Msg 10717, Level 15, State 1, Line 48 Предложение GROUP BY не допускается, когда предложение FROM содержит вложенный INSERT , UPDATE, DELETE или MERGE. –

+0

Протестировано на SQL Server 2008 Developer Edition –

+0

Я использовал ваше редактирование, затем взял ту таблицу, в которую вы вставляли и агрегировали отдельные действия в SUM-Totals с использованием Case-Statement и регистрировали эти результаты. Он отлично работает! Он воняет, что SQL Server заставляет меня вставлять результаты слияния в таблицу-переменную вместо агрегирования и установки моих внутренних переменных непосредственно во внешнем Select. – MikeTeeVee

4

Извлечение в indiv idual вары, может опубликовать процесс ответ на marc_s с помощью шарнира:

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; 

Объединение «nööp» строка может быть удалена, если инициализации вары 0 или знать, что источник или целевая таблица имеет> 0 строк.

Смежные вопросы