2017-02-10 67 views
1

當存儲過程包含超過4000個字符時,輸出參數有問題。該響應似乎被JDBC驅動程序截斷了?我怎樣才能得到完整的結果?來自SQL Server存儲過程的輸出參數被截斷爲4000個字符

存儲過程以完整響應(> 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中的存儲過程。

+1

您沒有給我們足夠的信息。然而,magic number 4000讓我覺得你有一個varchar,最大字符數爲4000. –

+0

這是我的代碼: CallableStatement pstmt = con.prepareCall(「{call sp_horus_get_consultorios_stv(?)}」); \t \t \t \t pstmt.registerOutParameter(1,-1); pstmt.setString(1,「」); pstmt.execute(); String sp_horus_get_consultorios_stv = pstmt.getString(1); 這適用於sybase中的存儲過程。答案已完成 –

+0

是的,它看起來像VARCHAR,更多的它必須是CLOB(或BLOB),它的處理方式不同 – Vadim

回答

0

根據我的理解,您的輸出參數的類型是NVARCHAR(8000),它是允許的最大顯式數字,並且輸出4000個字符的Unicode字符串長度(每字符2個字節)。

然而,和幸運的你,還有另一種可能性:NVARCHAR(MAX),基本上允許無限串lenght(當然,不是無限的,但幾乎: What is the maximum number of characters that nvarchar(MAX) will hold?

您應該將輸出paramater類型更改爲NVARCHAR (MAX)

快樂編碼。)

+0

是nvarchar(最大)el輸出參數 –

+1

否其數據庫中的值保存在其中的格式。@pauldaubian這與數據庫無關。它的一個java問題,她有 – XtremeBaumer

+0

你必須步入SQL Server並修改存儲過程_sp_horus_get_consultorios_stv._如果你想發佈它在你最初的問題,我們可以幫助你修改它,所以輸出是正確的。 –

2

我能夠重新使用Microsoft JDBC驅動程序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仍然遭受here所述的限制。因此,對於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 
} 
+0

是的,評論該行會返回完整的結果。謝謝 –

相關問題