Sql Server 2008 MERGE - лучший способ получить счета
Мне интересно, что y'alls порекомендует как лучший способ получить счетчик действий из инструкции MERGE на Sql Server.
Итак, то есть я запускаю MERGE, который делает некоторые вставки, некоторые обновления и некоторые удаления,... Я хотел бы узнать, КАК МНОГО Вставить, КАК МНОГИЕ обновления и сколько удаляет.
Каким был бы лучший способ сделать это?
Ответы
Ответ 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