sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server trunca silenciosamente varchar en procedimientos almacenados

Simplemente es .

Sin embargo, nunca he notado un problema porque una de mis comprobaciones sería asegurar que mis parámetros coincidan con las longitudes de las columnas de mi tabla. En el código del cliente también. Personalmente, espero que SQL nunca vea datos demasiado largos. Si viera datos truncados, sería muy obvio qué los causó.

Si siente la necesidad de varchar (max), tenga cuidado con un problema de rendimiento masivo debido a la precedencia del tipo de datos. varchar(max) tiene mayor precedencia que varchar(n) (el más largo es el más alto). Entonces, en este tipo de consulta, obtendrá un escaneo, no una búsqueda, y cada valor de varchar (100) se CAST a varchar (max)

UPDATE ...WHERE varchar100column = @varcharmaxvalue

Editar:

Hay un elemento abierto de Microsoft Connect relacionado con este problema.

Y probablemente valga la pena incluirlo en la configuración estricta de Erland Sommarkog (y el elemento de conexión correspondiente).

Edición 2, después del comentario de 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;