Подтвердить что ты не робот

Sql Server 2008 MERGE - лучший способ получить счета

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

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

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

4b9b3361

Ответ 1

Вы можете указать предложение 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

Зайдите в электронную книгу книг, чтобы узнать о MERGE и Вывод OUTPUT.

Марк

Ответ 2

Чтобы извлечь в отдельные vars, вы можете отправить ответ процесса marc_s с помощью 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;

Строка union noop может быть удалена, если init vars равен 0 или знает, что исходная или целевая таблица имеет > 0 строк.

Ответ 3

Как насчет:

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;

[Изменить] Хорошо, поэтому попробуйте:

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;

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

Rob