次のようなストアド プロシージャがあるとします。
CREATE PROCEDURE [dbo].[sp_update_dummy]
AS
BEGIN
update update_dummy set value = value + 1 where id = 1
END
これを (標準の java.sql ライブラリから) 使用して呼び出すとexecuteUpdate
、更新された行数が 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
。
SQL ストアド プロシージャの場合と同じ方法で行数を取得できるように、CLR ストアド プロシージャをコーディングする方法はありますか? 残念ながら、Java プログラム (これはサードパーティのコンポーネントです) を変更して、たとえば OUTPUT パラメータを取得することはできません。私は SqlContext.Pipe を見てきましたが、明らかなものは何もありません。また、行数が executeUpdate プロシージャに返されるメカニズムもわかりません。
問題を回避するためにハックを作成することはおそらくできますが (たとえば、Java は SQL ストアド プロシージャを実行し、それが CLR ストアド プロシージャを実行します)、可能であれば、コール スタックに別のレイヤーを導入したくありません。