如果我有這樣一個存儲過程:從CLR返回的行數的存儲過程
CREATE PROCEDURE [dbo].[sp_update_dummy]
AS
BEGIN
update update_dummy set value = value + 1 where id = 1
END
,並把這種使用executeUpdate
(從標準的java.sql庫),那麼更新的行數返回給Java程序(當然,假定update語句更新表中的一行)。
但是如果我執行CLR存儲過程編碼是這樣的:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void clr_update_dummy()
{
using (SqlConnection conn = new SqlConnection("context connection=true"))
{
SqlCommand command = new SqlCommand("update update_dummy set value = value + 1 where id = 1", conn);
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
}
然後Java程序沒有得到更新的行數(它似乎得到的值-1返回)。如果我將SET NOCOUNT ON
放入SQL存儲過程中,也會發生這種情況。
因此,在我看來,CLR存儲過程的行爲就好像使用了SET NOCOUNT ON
一樣。
是否有任何方法來編寫CLR存儲過程,以便可以採用與SQL存儲過程相同的方式獲取行計數?不幸的是,它不可能改變Java程序(它是第三方組件),例如,拿起一個OUTPUT參數。我看過SqlContext.Pipe,但沒有什麼明顯的。此外,我不確定行計數返回到executeUpdate過程的機制。
我也許可以創造一個黑客繞過這個問題(Java的執行SQL存儲過程,這反過來執行,例如CLR存儲過程),但如果可能的話,我想不會引入其他層到調用堆棧。
旁註:你不應該使用存儲過程的名稱'sp_'前綴 - 它保留了微軟的系統過程。 –
@Damien_The_Unbeliever - 我意識到這一點,我不明智地選擇了這個名字。 –
你需要使用CLR嗎?這只是爲了避免使用SQL? – gbn