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

Por que o T-SQL ISNULL() está truncando a string e o COALESCE não?


De acordo com a documentação da Microsoft , para função:
ISNULL(check_expression, replacement_value)

replacement_value deve ser de um tipo implicitamente conversível para o tipo de check_expression . Observe que tipo para 'xy'+NULL é VARCHAR(3) . Por causa disso, sua string 'ABCDEFGHIJ' é convertido para VARCHAR(3) e assim recortado.

Parece estranho porque não é VARCHAR(2) , mas é assim que é - um caractere maior que 'xy' . Você pode jogar com este SQLFiddle e veja por si mesmo esse tipo para 'xy'+NULL é o mesmo que para a expressão CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , que é NULL mas é implicitamente compatível com VARCHAR(3) .

Parece que para a expressão 'xy'+NULL comprimento percebido pode ser calculado como 'xy' comprimento da string (2) mais 1 para cada NULL adicionado. Por exemplo, digite 'xy'+NULL+NULL é VARCHAR(4) , digite para 'xy'+NULL+NULL+NULL é VARCHAR(5) e assim por diante - confira este SQLFiddle . Isso é extremamente estranho, mas é assim que o MS SQL Server 2008 e 2012 funcionam.