Получите количество строк затронутых строк действием из MERGE без использования выходных данных - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь получить количество затронутых строк по действию (обновить, вставить, удалить) после оператора слияния. Поскольку единственная информация, которая мне нужна, - это подсчеты, я бы предпочел не выводить данные в отдельное время для обработки времени.

Я могу делать отдельные операторы вставки, обновления и удаления и получать необходимую информацию по адресу @@ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...