Jakiego rozmiaru używasz dla varchar (MAX) w deklaracji parametru?

190

Zwykle ustawiam rozmiar kolumny podczas tworzenia parametru w ADO.NET

Ale jakiego rozmiaru używam, jeśli kolumna jest VARCHAR(MAX)?

cmd.Parameters.Add("@blah", SqlDbType.VarChar, ?????).Value = blah;
mrblah
źródło

Odpowiedzi:

288

W tym przypadku używasz -1.

Michał Chaniewski
źródło
5
czy jest jakaś wada wydajności w ustawianiu wszystkich długości parametrów na -1, więc nie muszę utrzymywać listy dopasowań db?
Andrew Bullock,
1
Varchar (max) jest traktowany identycznie jak varchar (8000) dla wartości mniejszych niż 8000 bajtów. W przypadku większych wartości pole jest traktowane jako pole „tekstowe” (inaczej „CLOB”). Może to wpłynąć na optymalizację planu zapytań i wydajność wyszukiwania wierszy o większych wartościach w tej kolumnie, ponieważ dane są przechowywane „poza wierszem”, co wymaga dodatkowego wyszukiwania.
KeithS
Użyj nvarchar (max) w sql i zdefiniuj długość -1 za pomocą SqlDbType.NVarchar in c #
Romil Kumar Jain
Gdyby nie odpowiedź Sama Meshesha poniżej - nie trafiłbym w twoją odpowiedź. Twoja odpowiedź może uzyskać więcej głosów, jeśli podasz przykładowy wiersz kodu sformatowanego jako kod.
qxotk
51

Dla tych z nas, którzy nie widzieli -1 Michała Chaniewskiego, pełna linia kodu:

cmd.Parameters.Add("@blah",SqlDbType.VarChar,-1).Value = "some large text";
Sam Meshesha
źródło
2

Maksymalny rozmiar SqlDbType.VarChar to 2147483647.

Jeśli użyjesz ogólnego połączenia oledb zamiast sql, znalazłem tutaj również typ danych LongVarChar. Jego maksymalny rozmiar to 2147483647.

cmd.Parameters.Add("@blah", OleDbType.LongVarChar, -1).Value = "very big string";
Eric Draven
źródło
1

Nie musisz przekazywać parametru rozmiaru, po prostu zadeklaruj, że Varcharjuż rozumiesz, że ma on wartość MAX:

cmd.Parameters.Add("@blah",SqlDbType.VarChar).Value = "some large text";
Igor Macedo
źródło
1
Może to mieć negatywny wpływ na serwer SQL ze względu na sposób obliczania planu wykonania.
yaakov,
Stwierdziłem, że tak nie jest w przypadku używania parametru wyjściowego. Powoduje to następujący błąd: „Wyjątek: Ciąg [2]: właściwość Rozmiar ma niepoprawny rozmiar 0.” Aby to naprawić, użyj Rozmiar = -1 patrz stackoverflow.com/questions/21087950/…
Michael K
1

Jeśli zrobisz coś takiego:

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

rozmiar zostanie pobrany z „jakiegoś dużego tekstu” .Length

Może to być problematyczne, gdy jest to parametr wyjściowy, nie odzyskujesz więcej znaków, niż wstawiasz jako dane wejściowe.

Alberto Tromba
źródło