Возвращаемые строки из хранимых процедур SQL Server усекаются - PullRequest
0 голосов
/ 22 мая 2018

Я использую веб-сайт с использованием классического ASP и SQL Server 2012 на IIS 7.5.Веб-сайт управляется данными, и я использую хранимые процедуры для создания строк текста HTML для представления веб-страницы.Но строки, возвращаемые из хранимых процедур, усекаются до 4000 символов.Как предотвратить усечение?

Подробности: моя хранимая процедура определяется как:

CREATE PROCEDURE [dbo].[spCourseButtonsDisplay]
    @str NVARCHAR(MAX) OUTPUT

Для конкатенации строк в хранимой процедуре используется cast (я где-то читал, что этозащитит от усечения):

SET @str = CAST(@str + ... AS nvarchar(MAX));

Наконец, я возвращаюсь с:

RETURN len(@str)

Обратите внимание, что я могу выполнить хранимую процедуру в SQL Server Management Studio и получить строки длиннее 4000 (Я проверил с> 12000).Но не так в asp.

Я определяю параметры хранимой процедуры в своем коде asp:

.Parameters.Append .CreateParameter("StrLen", 3, 4)  'adInteger, adParamReturnValue
.Parameters.Append .CreateParameter("Str", 202, 2, 2147483646)   'adVarWChar, adParamOutput

2147483646 на единицу меньше, чем MAX, но это наибольшее число, которое я могу поставить безошибка.

Но когда я выполняю хранимую процедуру из asp и выводю эти 3 значения:

Response.Write(CStr(objSP.Parameters("StrLen")) + "<br/>")
Response.Write(CStr(Len(objSP.Parameters("Str"))) + "<br/>")
Response.Write(objSP.Parameters("Str"))

, я получаю фактическую длину созданной хранимой процедуры (> 4000), 4000 иусеченная строка.

Как получить всю строку?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Приведенное выше предложение @SearchAndResQ для проверки Возвращение varchar (max) Выходного параметра хранимой процедуры, усекающего до 4000 символов - это то, что мне нужно: «Вам нужно использовать собственный клиент SQL Server вместоSQLOLEDB.1 для поддержки типов данных VARCHAR (MAX) и NVARCHAR (MAX), в противном случае они будут усечены до их эквивалентов SQLOLEDB ".Я изменил строку подключения с Provider=SQLOLEDB.1; на Provider=SQLNCLI10;.Я успешно протестировал> 12000 символов.Будьте осторожны, используя соответствующую версию собственного клиента SQL Server (SQLNCLI11, SQLNCLI10 или SQLNCLI).

0 голосов
/ 23 мая 2018

Попробуйте использовать -1 в качестве длины возвращаемого параметра.

...