Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server trunca silenciosamente varchar em procedimentos armazenados


É apenas é .

Eu nunca notei um problema, porque uma das minhas verificações seria garantir que meus parâmetros correspondam aos comprimentos das colunas da minha tabela. No código do cliente também. Pessoalmente, espero que o SQL nunca veja dados muito longos. Se eu visse dados truncados, seria óbvio o que causou isso.

Se você sentir a necessidade de varchar(max), tome cuidado com um grande problema de desempenho devido à precedência do tipo de dados. varchar(max) tem precedência mais alta que varchar(n) (mais longo é mais alto). Portanto, neste tipo de consulta, você obterá uma varredura, não uma busca e cada valor de varchar (100) é CAST para varchar (max)
UPDATE ...WHERE varchar100column = @varcharmaxvalue

Editar:

Há um item do Microsoft Connect aberto sobre esse problema.

E provavelmente é digno de inclusão nas configurações Strict de Erland Sommarkog (e no item Connect correspondente).

Edit 2, após o comentário 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;