2

我想通過Apache Common DbUtils調用SQLServer存儲的標量函數。 我想是這樣的:如何使用Apache DbUtils調用SQL標量函數

run.query("SELECT [MyDB].[dbo].[test] ('testParam')", new ScalarHandler());

但是,我得到這個異常:

com.microsoft.sqlserver.jdbc.SQLServerException: com.microsoft.sqlserver.jdbc.SQLServerException: Unable to identify the table SELECT [MyDB].[dbo].[test] ('testParam') for the metadata.

雖然,在運行SQLServer的同一查詢返回一個有效的標量值。

我想知道如何使用Apache DbUtils調用Scalar函數。

UPDATE:對於表值函數,如果我正餐作品「SELECT * FROM ...」

+0

您是否嘗試使用exec命令而不是select? http://msdn.microsoft.com/pt-br/library/ms188332.aspx –

+0

是的,EXEC不會返回任何東西。 –

+0

我沒有Apache Common DBUtils的經驗,但我會嘗試執行代碼,因爲我有一行一列的記錄集。 –

回答

3

它看起來有Apache中常見DbUtils一個bug(訴1.5)AbstractQueryRunner(基類QueryBuilder)代碼。它有參數pmdKnownBroken,其描述如下:

如果pmdKnownBroken設置爲true,我們甚至不會嘗試它;如果錯誤,我們會嘗試,如果錯誤,我們會記住不要再使用它。

但是並不像描述的那樣工作,因爲fillStatement方法在調用java.sql.getParameterMetaData時沒有發現異常。

所以你應該設置pmdKnownBroken爲真

0

我不知道是否有可能運行與DBUtils一個SQL Server標量函數,通過這種方式嘗試

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

如果你沒有找到DBUtils解決喲可以使用一個CallableStatement

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); 
+0

它引發與CALL相同的異常。第二個解決方案不是這個問題的答案。 –

+0

第一種解決方案不會爲我調用函數返回任何結果集,但不會引發相同的異常,請檢查調用語法。 – vzamanillo

+0

也許,因爲您在創建運行對象時傳遞了true作爲參數。隨着它的工作。 –