2017-02-10 16 views
1

У меня проблема с выходным параметром хранимой процедуры, когда она содержит более 4000 символов. Ответ кажется усеченным драйвером JDBC? Как я могу получить полный результат?Выходной параметр из хранимой процедуры SQL Server усечен с 4000 символами

Сохраненная процедура отвечает полным ответом (> 4000 символов), но я не могу открыть ее с Java. Я пробовал как jTDS, так и драйвер JDBC от Microsoft 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

Вы не предоставили нам достаточно информации. Тем не менее, магическое число 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(); Строка sp_horus_get_consultorios_stv = pstmt.getString (1); Это работает с хранимыми процедурами в sybase. Ответ завершен –

+0

да, это похоже на VARCHAR, для более того он должен быть CLOB (или BLOB), который обрабатывает по-разному – Vadim

ответ

0

Из того, что я понимаю, ваш выходной параметр имеет тип NVARCHAR (8000), который является максимально допустимым явным числом, и выводит длину строки Unicode длиной 4000 символов (2 байта на символ).

Однако, и вам повезло, есть еще одна возможность: NVARCHAR (MAX), что в принципе позволяет бесконечной струны длину (ну, не бесконечно, но почти: What is the maximum number of characters that nvarchar(MAX) will hold?

Вы должны изменить тип вывода В параметре для NVARCHAR (MAX)

Днем кодирования;).

+0

is nvarchar (max) el output parameter –

+1

нет его в вашей базе данных формат, в котором сохраняется значение. @pauldaubian это не имеет ничего общего с базой данных. его проблема с java у нее есть – XtremeBaumer

+0

Вам нужно войти в SQL Server и изменить хранимую процедуру _sp_horus_get_consultorios_stv._ Если вы хотите опубликовать ее в своем первоначальном вопросе, мы можем помочь вам изменить ее, чтобы результат был правильным. –

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 
} 
+0

Да, комментируя эту строку, возвращается полный результат. спасибо –

 Смежные вопросы

  • Нет связанных вопросов^_^