Я пытаюсь получить количество затронутых строк по действию (обновить, вставить, удалить) после оператора слияния. Поскольку единственная информация, которая мне нужна, - это подсчеты, я бы предпочел не выводить данные в отдельное время для обработки времени.
Я могу делать отдельные операторы вставки, обновления и удаления и получать необходимую информацию по адресу @@ ROWCOUNT. С помощью слияния я могу вывести данные в другую таблицу, а затем развернуть результаты, но я надеялся на что-то немного похожее на @@ ROWCOUNT для явных действий.
Текущее решение:
--Mock up a target table and a source table and populate with some data
DROP TABLE IF EXISTS TargetTable
CREATE TABLE TargetTable
(
Field1 int,
Field2 int,
Field3 int,
Field4 int
)
DROP TABLE IF EXISTS SourceTable
CREATE TABLE SourceTable
(
Field1 int,
Field2 int,
Field3 int,
Field4 int
)
INSERT INTO SourceTable
(
Field1,
Field2,
Field3,
Field4
)
VALUES ( 1, 2, 3, 7 ),
( 1, 2, 4, 7 ),
( 1, 2, 5, 7 ),
( 1, 2, 6, 7 ),
( 2, 1, 1, 7 ),
( 2, 1, 2, 7 )
--Make a table to hold output
DROP TABLE IF EXISTS #Output
CREATE TABLE #Output
(
[Action] nvarchar(10)
)
--Write a merge with the actions outputed into our temp table
MERGE TargetTable AS Target
USING SourceTable AS Source
ON ( Target.Field1 = Source.Field1
AND Target.Field2 = Source.Field2
AND Target.Field3 = Source.Field3 )
WHEN NOT MATCHED BY Target
THEN INSERT ( Field1,
Field2,
Field3,
Field4 )
VALUES ( Source.Field1,
Source.Field2,
Source.Field3,
Source.Field4 )
WHEN MATCHED
THEN UPDATE SET Target.Field4 = Source.Field4
WHEN NOT MATCHED BY Source
THEN DELETE
OUTPUT $Action INTO #Output;
--Pivot the results to get output by action
SELECT [INSERT],
[UPDATE],
[DELETE]
FROM #Output
PIVOT ( COUNT( [Action] ) FOR [Action] IN ( [INSERT],
[UPDATE],
[DELETE] ) ) AS PivotedOutput