如果我有这样的存储过程:
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 存储过程),但如果可能的话,我不想在调用堆栈中引入另一层。