Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server tronca automaticamente i varchar nelle stored procedure

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;