[英]Microsoft SQL Server JPA Stored Procedure com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near '{'
[英]JDBC call to a synonym to Microsoft SQL Server stored procedure
使用Microsoft提供的JDBC驅動程序(sqljdbc4.jar)我無法使用為其定義的同義詞調用存儲過程。 即同義詞定義為:
CREATE SYNONYM dbo.synonym_name for dbo.procedure_name
當運行由以下創建的可調用語句時:
CallableStatement callStmt = conn.prepareCall("{ call [dbo].[synonym_name] (?,?,?,?,?,?) }");
我得到一個例外:
Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: Parameter param_name was not defined for stored procedure [dbo].[synonym_name].
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.findColumn(SQLServerCallableStatement.java:1217)
at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.setString(SQLServerCallableStatement.java:1563)
at testmssql.main(testmssql.java:53)
即使參數設置正確(如果我直接調用過程(繞過同義詞),一切正常)。
此外,如果我用JTDS替換微軟的驅動程序,一切正常。
如何使用Microsoft SQL Server的JDBC驅動程序使用存儲過程的同義詞來運行CallableStatement
?
SQL Server同義詞沒有可查詢的元數據。 根據錯誤判斷,JDBC正在嘗試確認Java代碼中聲明的參數與存儲過程中聲明的參數匹配。 由於缺少元數據,這失敗了。
解決此問題的唯一方法是創建直通存儲過程而不是同義詞。 所以如果你有這個程序:
CREATE PROCEDURE dbo.RealProcedure
@p1 INT,
@p2 INT
AS
BEGIN
RAISERROR('TODO: implement me',16,10);
END
你有這個同義詞:
CREATE SYNONYM dbo.myProcedure FOR dbo.realProcedure;
刪除同義詞並改為創建此過程:
CREATE PROCEDURE dbo.myProcedure
@p1 INT,
@p2 INT
AS
BEGIN
EXEC dbo.realProcedure @p1,@p2;
END
這里描述了類似的問題: http : //social.msdn.microsoft.com/Forums/en-us/sqldataaccess/thread/dcdfee17-a926-4b57-8641-ed86fec989f2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.