Какой размер вы используете для varchar (MAX) в объявлении параметров?

190

Я обычно устанавливаю размер столбца при создании параметра в ADO.NET

Но какой размер я должен использовать, если столбец VARCHAR(MAX)?

cmd.Parameters.Add("@blah", SqlDbType.VarChar, ?????).Value = blah;
mrblah
источник

Ответы:

288

В этом случае вы используете -1.

Михал Чаневский
источник
5
Есть ли какой-либо недостаток производительности при установке всех длин параметра на -1, поэтому мне не нужно вести список соответствия БД?
Эндрю Баллок
1
Varchar (max) обрабатывается идентично varchar (8000) для значений менее 8000 байтов. Для больших значений поле обрабатывается как текстовое поле (также называемое «CLOB»). Это может повлиять на оптимизацию плана запроса и эффективность извлечения строк с большими значениями в этом столбце, так как данные хранятся «вне строки», что требует дополнительного поиска.
KeithS
Используйте nvarchar (max) в sql и определите длину -1 с помощью SqlDbType.NVarchar в c #
Ромил Кумар Джайн
Если бы не ответ Сэма Мешеши ниже - я бы пропустил ваш ответ. Ваш ответ может получить больше голосов, если вы поместите образец строки кода в формате кода.
qxotk
51

Для тех из нас, кто не видел -1 Михала Чаневски, полная строка кода:

cmd.Parameters.Add("@blah",SqlDbType.VarChar,-1).Value = "some large text";
Сэм Мешеша
источник
2

Максимальный размер SqlDbType.VarChar составляет 2147483647.

Если бы вы использовали общее соединение oledb вместо sql, я обнаружил, что здесь также есть тип данных LongVarChar. Его максимальный размер 2147483647.

cmd.Parameters.Add("@blah", OleDbType.LongVarChar, -1).Value = "very big string";
Эрик Дравен
источник
1

Вам не нужно передавать параметр size, просто объявляйте, Varcharчто он уже понимает, что это MAX:

cmd.Parameters.Add("@blah",SqlDbType.VarChar).Value = "some large text";
Игорь Маседо
источник
1
Это может иметь негативные последствия для вашего сервера SQL из-за того, как рассчитывается план выполнения.
Яаков
Я обнаружил, что это не тот случай, когда используется выходной параметр. Это приводит к следующей ошибке «Exception: String [2]: свойство Size имеет недопустимый размер 0.» Чтобы исправить это, используйте Size = -1, см. Stackoverflow.com/questions/21087950/…
Michael K
1

Если вы делаете что-то вроде этого:

    cmd.Parameters.Add("@blah",SqlDbType.VarChar).Value = "some large text";

Размер будет взят из "некоторого большого текста". Длина

Это может быть проблематично, когда это выходной параметр, вы получаете больше символов, чем вводите.

Альберто Тромба
источник