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.