2013-05-20 65 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。 –