Определение результата оператора SQL MERGE - PullRequest
4 голосов
/ 01 июня 2010

Есть ли способ определить, была ли запись сопоставлена ​​или нет (была ли запись вставлена ​​или обновлена) после вызова MERGE?

В идеале я хотел бы вывести его на параметр.

Edit: У меня есть оператор слияния, выводящий то, что произошло в моей студии управления, используя следующий оператор: Скажем, у меня было следующее заявление о слиянии:

MERGE INTO TestTable as target
USING ( select '00D81CB4EA0842EF9E158BB8FEC48A1E' )
AS source (Guid)
ON ( target.Guid = source.Guid ) 
WHEN MATCHED THEN
UPDATE SET Test_Column = NULL
WHEN NOT MATCHED THEN
INSERT (Guid, Test_Column) VALUES ('00D81CB4EA0842EF9E158BB8FEC48A1E', NULL)
OUTPUT $action;

Я пытаюсь использовать параметр для получения вывода '$ action'.

1 Ответ

5 голосов
/ 01 июня 2010

Что вы можете сделать, это создать временную таблицу (или переменную таблицы) и отправить туда свои выходные данные - добавьте несколько значимых полей в предложение OUTPUT, чтобы было ясно, какая строка была На что влияет действие:

DECLARE @OutputTable TABLE (Guid UNIQUEIDENTIFIER, Action VARCHAR(100))

MERGE INTO TestTable as target
USING ( select '00D81CB4EA0842EF9E158BB8FEC48A1E' )
AS source (Guid)
ON ( target.Guid = source.Guid ) 
WHEN MATCHED THEN
UPDATE SET Test_Column = NULL
WHEN NOT MATCHED THEN
INSERT (Guid, Test_Column) VALUES ('00D81CB4EA0842EF9E158BB8FEC48A1E', NULL)
OUTPUT INSERTED.Guid, $action INTO @OutputTable

SELECT
   Guid, Action
FROM
   @OutputTable

ОБНОВЛЕНИЕ: ах, хорошо, так что вы хотите позвонить из .NET! Ну, в таком случае, просто вызовите его с помощью метода .ExecuteReader() на вашем SqlCommand объекте - материал, который вы выводите с помощью OUTPUT..., будет возвращен вызывающей стороне .NET в качестве набора результатов - вы можете выполнить цикл :

using(SqlCommand cmd = new SqlCommand(mergeStmt, connection))
{
   connection.Open();

   using(SqlDataReader rdr = cmd.ExecuteReader())
   {
      while(rdr.Read())
      {
         var outputAction = rdr.GetValue(0);
      }

      rdr.Close();
   }
   connection.Close();
}

Вы должны получить итоговое "действие" из этого считывателя данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...