Semplicemente è .
Tuttavia, non ho mai notato un problema perché uno dei miei controlli sarebbe quello di garantire che i miei parametri corrispondano alle lunghezze delle colonne della tabella. Anche nel codice client. Personalmente, mi aspetto che SQL non veda mai dati troppo lunghi. Se vedessi dati troncati, sarebbe ovvio che cosa li ha causati.
Se senti la necessità di varchar(max) fai attenzione a un enorme problema di prestazioni a causa della precedenza del tipo di dati. varchar(max) ha una precedenza maggiore rispetto a varchar(n) (il più lungo è il più alto). Quindi in questo tipo di query otterrai una scansione non una ricerca e ogni valore varchar(100) è CAST su varchar(max)
UPDATE ...WHERE varchar100column = @varcharmaxvalue
Modifica:
È presente un elemento Microsoft Connect aperto relativo a questo problema.
Ed è probabilmente degno di essere incluso nelle impostazioni Strict di Erland Sommarkog (e nell'elemento Connect corrispondente).
Modifica 2, dopo il commento di Martins:
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;