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.