Po prostu jest .
Nigdy jednak nie zauważyłem problemu, ponieważ jednym z moich sprawdzeń byłoby upewnienie się, że moje parametry pasują do długości kolumn tabeli. Również w kodzie klienta. Osobiście spodziewałbym się, że SQL nigdy nie zobaczy zbyt długich danych. Gdybym zobaczył obcięte dane, byłoby oczywiste, co je spowodowało.
Jeśli czujesz potrzebę varchar(max), strzeż się ogromnego problemu z wydajnością ze względu na pierwszeństwo typów danych. varchar(max) ma wyższy priorytet niż varchar(n) (najdłuższy to najwyższy). Więc w tym typie zapytania otrzymasz skanowanie, a nie wyszukiwanie, a każda wartość varchar(100) to CAST do varchar(max)
UPDATE ...WHERE varchar100column = @varcharmaxvalue
Edycja:
Istnieje otwarta pozycja Microsoft Connect dotycząca tego problemu.
I prawdopodobnie warto włączyć go do ustawień ścisłych Erlanda Sommarkog (i pasującego elementu Connect).
Edycja 2, po komentarzu Martina:
DECLARE @sql VARCHAR(MAX), @nsql nVARCHAR(MAX);
SELECT @sql = 'B', @nsql = 'B';
SELECT
LEN(@sql),
LEN(@nsql),
DATALENGTH(@sql),
DATALENGTH(@nsql)
;
DECLARE @t table(c varchar(8000));
INSERT INTO @t values (replicate('A', 7500));
SELECT LEN(c) from @t;
SELECT
LEN(@sql + c),
LEN(@nsql + c),
DATALENGTH(@sql + c),
DATALENGTH(@nsql + c)
FROM @t;