2013-05-20 66 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 

我要赶UPDATE子句输出,并返回其作为过程的输出参数,所以我可以在我的.NET代码处理。我怎样才能做到这一点?

+0

请问UPDATE总是只影响的具体哪一行?你是什​​么意思的输出?整排? – 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(零)。无论如何,我已经解决你的解决方案。如果更新没有发生,则不返回任何内容,以这种方式,body从未执行,并且插入的ID(在我的情况下声明的外部ID)仍然设置为0. 如果update发生reader.GetInt32(0),则将insertedID设置为1。 –