从CLR存储过程返回rowcount

时间:2013-07-03 14:16:19

标签: sql-server-2008-r2 clrstoredprocedure

如果我有这样的存储过程:

CREATE PROCEDURE [dbo].[sp_update_dummy]
AS
BEGIN
  update update_dummy set value = value + 1 where id = 1
END

并使用executeUpdate(来自标准java.sql库)调用它,然后将更新的行计数返回给Java程序(当然,假设update语句更新了表中的一行)。 / p>

但是,如果我执行这样编码的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存储过程),但如果可能的话,我不想在调用堆栈中引入另一个层。 / p>

1 个答案:

答案 0 :(得分:0)

你可能(如果只是转过来并在你的CLR程序中运行一段SQL)是想调用ExecuteAndSend

  

除了任何实际结果外,其他消息和错误也会直接发送给客户端。

SqlCommand command = new SqlCommand("update update_dummy set value = value + 1 where id = 1", conn);
conn.Open();

SqlContext.Pipe.ExecuteAndSend(command);