0

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

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

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

但是,如果我执行如下编码的 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 程序(它是第 3 方组件)更改为例如获取 OUTPUT 参数。我看过 SqlContext.Pipe 但那里没有什么明显的。此外,我不确定将行计数返回给 executeUpdate 过程的机制。

我可能会创建一个 hack 来解决这个问题(例如,Java 执行一个 SQL 存储过程,而后者又执行一个 CLR 存储过程),但如果可能的话,我不想在调用堆栈中引入另一层。

4

1 回答 1

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);
于 2013-07-03T14:30:23.133 回答