2010-05-31 3 views
4

Есть ли способ определить, была ли запись сопоставлена ​​или нет (была ли вставлена ​​или обновлена ​​запись) после вызова MERGE?Определение результата оператора SQL 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.

+0

Для какой базы данных? –

+0

отредактировано с дополнительной информацией – petejamd

+0

Я не могу проверить это, но вы используете его таким образом, чтобы он мог повлиять только на одну строку? Если это так, 'OUTPUT @SomeVariable = $ action"; 'work? –

ответ

5

Что вы могли бы сделать, это создать временную таблицу (или табличную переменную) и отправить выход есть - добавить некоторые значимые поля к пункту 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(); 
} 

Вы должны вернуть результат «$ action» из этого устройства чтения данных.

+0

благодаря так что нет никакого способа, чтобы использовать SqlCommand.Parameters чтобы получить действие $ then? – petejamd

+0

дополнительно, используя ExecuteScalar, если вы знаете, что хотите получить только одну строку, рекомендуется – petejamd

+0

@petej amd: на самом деле, ExecuteScalar следует использовать только тогда, когда вы получаете одну строку * и * один столбец назад! Только один результат. И нет - действие $ не может быть доступно через коллекцию SqlCommand.Parameters - это не вход или выходной параметр, а часть набора результатов. –

Смежные вопросы