Java 如何使用ApacheDbutils调用SQL标量函数

Java 如何使用ApacheDbutils调用SQL标量函数,java,sql-server,jdbc,user-defined-functions,apache-commons-dbutils,Java,Sql Server,Jdbc,User Defined Functions,Apache Commons Dbutils,我试图通过apachecommondbutils调用一个SQLServer存储的标量函数。 我试过这样的方法: run.query(“选择[MyDB].[dbo].[test]('testParam')”,新建ScalarHandler()) 但是,我有一个例外: com.microsoft.sqlserver.jdbc.SQLServerException:com.microsoft.sqlserver.jdbc.SQLServerException:无法识别表,请为元数据选择[MyDB].[

我试图通过apachecommondbutils调用一个
SQLServer
存储的标量函数。 我试过这样的方法:

run.query(“选择[MyDB].[dbo].[test]('testParam')”,新建ScalarHandler())

但是,我有一个例外:

com.microsoft.sqlserver.jdbc.SQLServerException:com.microsoft.sqlserver.jdbc.SQLServerException:无法识别表,请为元数据选择[MyDB].[dbo].[test]('testParam')。

同时,在SQLServer中运行相同的查询将返回有效的标量值

我想知道如何使用ApacheDbutils调用标量函数


更新:对于表值函数,如果我使用“
SELECT*FROM
..”

我不确定是否可以使用DBUtils运行SQL Server标量函数,请通过这种方式尝试

Object[] params = {"inputparam"};
ScalarHandler<T> scalar = new ScalarHandler<T>();
run.query("{CALL DB.dbo.test(?)}", scalar, params);

看起来Apache Common DbUtils(1.5版)
AbstractQueryRunner
(QueryBuilder
的基类)代码中有一个bug。它有参数
pmdnownbroken
,描述如下:

如果
pmdnownbroken
设置为true,我们甚至不会尝试它;如果错误,我们将尝试它,如果它坏了,我们将记住不再使用它

但是没有按描述的那样工作,因为该方法在调用
java.sql.getParameterMetaData
时不会捕获异常


因此,您应该将pmdnownbroken设置为true

您是否尝试过使用exec命令而不是select?是的,EXEC不返回任何内容。我没有使用Apache Common DBUtils的经验,但我会尝试执行代码,因为我有一个记录集,其中有一行和一列。run是QueryRunner的实例吗?它在构造函数中具有未知的参数。尝试将其设置为true。是否尝试在ScalarHandler中设置ResultSet参数?它会在调用时引发相同的异常。第二个解决方案不是这个问题的答案。第一个解决方案不会为我调用函数返回任何resultset,但不会引发相同的异常,请检查调用语法。可能是因为您在创建run对象时将true作为参数传递。我在对你的问题的评论中问过你这个参数。它能解决问题吗?
String url = "jdbc:sqlserver://....";
SQLServerDataSource sqls = new SQLServerDataSource();
sqls.setURL(url);
sqls.getConnection();

CallableStatement callStatement = sqls.getConnection().prepareCall("{? = CALL DB.dbo.f_promedio(?,?)}");
callStatement.setDouble(2, 1.8);
callStatement.setDouble(3, 6.8);
callStatement.registerOutParameter(1, java.sql.Types.DECIMAL);
callStatement.execute();

double d = callStatement.getDouble(1);