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

标签 java sql-server jdbc

当存储过程的输出参数包含超过 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 仍然受到描述的限制 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
}

关于java - SQL Server 存储过程的输出参数被截断为 4000 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42160157/

相关文章:

sql-server - 交叉连接时出错

sql-server - SQL Server 2008 未使用空间索引

mysql - MariaDB jdbc 连接在批量插入期间失败

java - 为什么这里不允许转换为 "GenericType<?>"?

java - JPanel 不重绘

sql-server - 尝试更改连接到 SQL Server 数据库的 perl 脚本中的连接主机名

jdbc - 如何在 JDBCexecuteBatch 中忽略所有错误语句并执行所有正确语句?

java - 如何减小 jfree 库的大小

java - 无法使用 Spring Boot 为 azure 虚拟目录中存在的文件生成下载链接

sql-server - WAS 8.5 在故障转移处理具有 JNDI 名称 XXX 的资源时无法找到主池管理器