Det er bare .
Jeg har dog aldrig bemærket et problem, fordi en af mine kontroller ville være at sikre, at mine parametre matcher mine tabelkolonnelængder. Også i klientkoden. Personligt ville jeg forvente, at SQL aldrig ser data, der er for lange. Hvis jeg så trunkerede data, ville det være tydeligt, hvad der forårsagede det.
Hvis du føler behovet for varchar(max), pas på et massivt præstationsproblem på grund af datatypeforrang. varchar(max) har højere forrang end varchar(n) (længst er højest). Så i denne type forespørgsel får du en scanning og ikke en søgning, og hver varchar(100) værdi er CAST til varchar(max)
UPDATE ...WHERE varchar100column = @varcharmaxvalue
Rediger:
Der er et åbent Microsoft Connect-emne vedrørende dette problem.
Og det er nok værd at inkludere i Erland Sommarkogs strenge indstillinger (og matchende Connect-element).
Edit 2, efter Martins kommentar:
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;