簡體   English   中英

SQL Server存儲過程的輸出參數被截斷為4000個字符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM