Возвращение varchar (max) Выходной параметр из хранимой процедуры усечения до 4000 символов

У меня есть классический ASP-приложение с базой данных SQL2012. Недавно я изменил столбец таблицы с varchar (8000) на varchar (max), поскольку он был недостаточно большим для хранения необходимых данных.

Я могу обновить столбец всеми данными, которые мне нужно сохранить, но SP, который я использую для возврата данных столбца в качестве выходного параметра, возвращает только 4000 символов (по крайней мере, это то, что дает мне результат следующего кода:

Len(cmd.Parameters("@detail").Value)

Я использую следующее объявление параметра как часть вызова SP:

cmd.Parameters.Append cmd.CreateParameter("@detail", 8, 2,  -1, strDetail)

8 - значение для adBStr. Я пробовал изменить 8 на 200, 201 и 203, но это дает следующую ошибку:

Ошибка: 800a0e7c

Описание:
Объект параметра определен неправильно. Была предоставлена ​​непоследовательная или неполная информация.

Я думал, что обновление данных будет сложной задачей, но я просто не могу понять, как получить все содержимое столбца.

Я возвращаю DATALENGTH столбца, и он говорит, что он имеет длину 10 536, но я получаю только 4000 символов, включая пробелы, возвращаемые через выходной параметр. Я вижу все данные (10 тыс. Символов) из Visual Studio, поэтому знаю, что они там есть.

Моя строка подключения Provider = SQLOLEDB.1. Может ли это быть проблемой? Должен ли я использовать более новый поставщик OLE DB для собственного клиента SQL Server 11.0 - SQLNCLI11?

У кого-нибудь есть идеи?

Привет, Майк.


person Mike    schedule 10.02.2014    source источник
comment
Не могли бы вы просто использовать текстовый столбец вместо varchar, тогда вы можете ввести столько символов, сколько захотите (ну, до 2 ГБ)   -  person John    schedule 10.02.2014
comment
Насколько я понимаю, текст был объявлен устаревшим еще в SQL2005. Варчар (макс.) В любом случае дает такую ​​же возможность до 2 ГБ. Я читал об усечении, происходящем из-за неявного преобразования varchar (max) в varchar, но я не вижу, где это произойдет в моем случае. Спасибо за комментарий.   -  person Mike    schedule 10.02.2014
comment
stackoverflow.com/questions/834788 / Строка подключения - не проблема   -  person Zam    schedule 10.02.2014
comment
@ Майк, я могу ошибаться, но разве ты не используешь cmd.Parameters.Append cmd.CreateParameter("@detail", 200, 3, -1, strDetail)? - Предпочитайте использовать константы ADO, добавляя metadata в global.asa, чтобы было cmd.Parameters.Append cmd.CreateParameter("@detail", adVarChar, adParamInputOutput, -1, strDetail) см. это отличный ресурс, которым я клянусь. По какой причине вы используете adParamInputOutput (3) вместо adParamInput (1)?   -  person user692942    schedule 10.02.2014
comment
Привет, @Lankymart. Не любит 200,3, -1 тоже извините. Я получаю следующую ошибку: ErrorCode = 800a0e7c, Description = Parameter объект определен неправильно. Была предоставлена ​​непоследовательная или неполная информация. Я фактически изменил направление параметров с 3 на 2, поскольку все они являются выходными параметрами из SP. Ваше здоровье.   -  person Mike    schedule 11.02.2014
comment
@Lankymart Я изменил режим параметров с 3 на 2 без разницы. В конце концов, я признал поражение и прибег к использованию двух выходных параметров varchar (8000) и разделению данных столбца по обоим из них с помощью функций LEFT и SUBSTRING в SQL.   -  person Mike    schedule 12.02.2014
comment
@Mike Если он возвращает только 4000 символов, он ведет себя как nvarchar, а не varchar, что будет 8000 символов. Это база данных SQL Server 2008, отражает ли это режим совместимости? Это все, что я могу придумать, единственное, что я могу придумать, что заставило бы тип данных стоять в строке. Возможно, этот поток поможет.   -  person user692942    schedule 12.02.2014
comment
@Mike Еще немного покопайтесь, подумайте, может быть, вы правы в отношении мысли о строке подключения, см. эта статья "You have to be using SQL Native Client, and not SQLOLEDB. Because SQLOLEDB only understands old-school LOB types, the new large-value types get mapped to old-school LOB types at run-time if you're using SQLOLEDB"   -  person user692942    schedule 12.02.2014


Ответы (1)


Ваше предположение о строке подключения верно

Вам необходимо использовать собственный клиент SQL Server вместо SQLOLEDB.1 для поддержки типов данных VARCHAR(MAX) и NVARCHAR(MAX), иначе они будут усечены обратно до эквивалентов SQLOLEDB.

Затем вы хотите использовать следующие определения параметров

'For varchar(max) OUTPUT use;
Call cmd.Parameters.Append(cmd.CreateParameter("@detail", adLongVarChar, adParamOutput, -1, strDetail))

'For nvarchar(max) OUTPUT use;
Call cmd.Parameters.Append(cmd.CreateParameter("@detail", adLongVarWChar, adParamOutput, -1, strDetail))

'** Constants **
' adLongVarChar = 201
' adLongVarWChar = 203
' adParamOutput = 2
person user692942    schedule 11.02.2014