2013-05-20 2 views
2

У меня есть эта процедура:Ручка вывод хранимой процедура

ALTER PROCEDURE [xyz].[stored_proc] 
    @input1 as int, 
    @input2 as nvarchar(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE ... 
    SET [email protected] 
    WHERE [email protected] AND 
    input3 NOT IN (123) 
END 

Я хочу, чтобы поймать обновления вывод дизъюнкции и вернуть его в качестве выходного параметра процедуры, так что я могу справиться с этим в моем коде .NET. Как я могу это достичь?

+0

будет ли UPDATE всегда затрагивают только ровно одну строку? И что вы имеете в виду OUTPUT? весь ряд? – gbn

ответ

2

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

using (SqlConnection conn = new SqlConnection(-your-connection-string-here-)) 
using (SqlCommand cmd = new SqlCommand("[xyz].[stored_proc]", conn)) 
{ 
    cmd.CommandType = CommandType.StoredProcedure; 

    conn.Open(); 

    // execute your UPDATE statement with an OUTPUT clause into a SqlDataReader 
    using(SqlDataReader reader = cmd.ExecuteReader()) 
    { 
     // read the values returned from the OUTPUT clause 
     while(reader.Read()) 
     { 
      int insertedID = reader.GetInt32(0); 
      // do something with those values....     
     } 
    } 

    conn.Close(); 
} 

Это предполагает, что ваш UPDATE заявление внутри хранимой процедуры будет выглядеть примерно так:

UPDATE ... 
OUTPUT Inserted.ID -- or something else.... 
SET input1 = @input1 
WHERE input2 = @input2 
    AND input3 NOT IN (123) 
+0

Я ранее использовал предложение OUTPUT, но это вернет что-то, только если обновление будет выполнено, в противном случае - нулевое значение. Я всегда получаю определенное значение, даже если обновление не выполняется. –

+0

@ marianoc84: если вы ** не обновляете ** ничего - что именно вы хотите вернуть тогда?!?!?! Все строки в таблице ??? –

+0

0 (ноль). В любом случае я решил с вашим решением. ничего не возвращается, если обновление не было, таким образом, пока тело никогда не выполняется, а insertID (объявленный снаружи в моем случае) по-прежнему установлен в 0. Если обновление происходит reader.GetInt32 (0), установите insertID в 1. –