Prostě je .
Nikdy jsem si však nevšiml problému, protože jednou z mých kontrol by bylo zajistit, aby mé parametry odpovídaly délkám sloupců tabulky. I v kódu klienta. Osobně bych očekával, že SQL nikdy neuvidí data, která jsou příliš dlouhá. Pokud bych viděl zkrácená data, bylo by zjevné, co to způsobilo.
Pokud máte pocit, že potřebujete varchar(max), dejte si pozor na masivní problém s výkonem kvůli prioritě datových typů. varchar(max) má vyšší prioritu než varchar(n) (nejdelší je nejvyšší). Takže v tomto typu dotazu získáte sken, ne hledání a každá hodnota varchar(100) je CAST na varchar(max)
UPDATE ...WHERE varchar100column = @varcharmaxvalue
Upravit:
Existuje otevřená položka Microsoft Connect týkající se tohoto problému.
A pravděpodobně si to zaslouží zahrnutí do Strict nastavení Erlanda Sommarkoga (a odpovídající položky Connect).
Upravit 2 po Martinově komentáři:
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;