[英]get both output parameter and ResultSet values from SQL Server stored procedure
[英]Output parameter from SQL Server stored procedure truncated at 4000 characters
當存儲過程的輸出參數包含4000個以上的字符時,我遇到了問題。 響應似乎被JDBC驅動程序截斷了嗎? 如何獲得完整結果?
存儲過程以完整的響應(> 4000個字符)回答,但是我無法從Java中打開它。 我已經嘗試了jTDS和Microsoft的JDBC驅動程序6.0。 這是我的代碼:
CallableStatement pstmt = con.prepareCall("{call sp_horus_get_consultorios_stv(?)}");
pstmt.registerOutParameter(1, -1);
pstmt.setString(1, "");
pstmt.execute();
String sp_horus_get_consultorios_stv = pstmt.getString(1);
這適用於sybase中的存儲過程。
我能夠使用Microsoft JDBC Driver 6.x重新創建您的問題。 我發現我可以通過注釋掉setString
調用來避免此問題:
try (CallableStatement pstmt = conn.prepareCall("{call usp_horus_get_consultorios_stv(?)}")) {
pstmt.registerOutParameter(1, Types.LONGNVARCHAR);
//pstmt.setString(1, ""); // disabled
pstmt.execute();
String sp_horus_get_consultorios_stv = pstmt.getString(1);
System.out.println(sp_horus_get_consultorios_stv.length()); // > 4000 characters
}
不幸的是,該修補程序無法解決jTDS 1.3.1下的問題。 看來jTDS仍然受到此處描述的限制。 因此,對於jTDS,看來我們必須執行以下操作:
String sql =
"DECLARE @out NVARCHAR(MAX);" +
"EXEC usp_horus_get_consultorios_stv @out OUTPUT;" +
"SELECT @out;";
try (
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(sql)) {
rs.next();
String sp_horus_get_consultorios_stv = rs.getString(1);
System.out.println(sp_horus_get_consultorios_stv.length()); // > 4000 characters
}
據我了解,您的輸出參數的類型為NVARCHAR(8000),這是允許的最大顯式數,並輸出4000個字符的Unicode字符串長度(每個字符2個字節)。
但是,幸運的是,還有另一種可能性:NVARCHAR(MAX),它基本上允許無限的字符串長度(嗯,不是無限的,但是幾乎是: nvarchar(MAX)可以容納的最大字符數是多少?
您應該將輸出參數類型更改為NVARCHAR(MAX)。
快樂的編碼;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.