SQL Server存储过程的输出参数截断为4000个字符

时间:2017-02-10 13:06:47

标签: java sql-server jdbc

当存储过程的输出参数包含超过4000个字符时,我遇到了问题。响应似乎被JDBC驱动程序截断了?我怎样才能得到完整的结果?

存储过程以完整的响应(> 4000个字符)回答,但我无法从Java打开它。我试过了jTDS和微软的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中的存储过程。

2 个答案:

答案 0 :(得分:2)

我能够使用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仍然受到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
}

答案 1 :(得分:0)

据我所知,您的输出参数是NVARCHAR(8000)类型,它是允许的最大显式数,并输出4000个字符的Unicode字符串长度(每个字符2个字节)。

然而,幸运的是,还有另一种可能性:NVARCHAR(MAX),它基本上允许无限长度的字符串(嗯,不是无限的,但几乎: What is the maximum number of characters that nvarchar(MAX) will hold?

您应该将输出参数类型更改为NVARCHAR(MAX)。

快乐的编码;)