Selon la documentation de Microsoft , pour la fonction :
ISNULL(check_expression, replacement_value)
replacement_value doit être d'un type implicitement convertible en type check_expression . Notez que tapez pour 'xy'+NULL est VARCHAR(3) . À cause de cela, votre chaîne 'ABCDEFGHIJ' est converti en VARCHAR(3) et ainsi coupé.
Cela semble étrange pourquoi ce n'est pas VARCHAR(2) , mais c'est ainsi - un caractère de plus que 'xy' . Vous pouvez jouer avec ce SQLFiddle
et voyez par vous-même ce type pour 'xy'+NULL est le même que pour l'expression CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , qui est NULL mais est implicitement compatible avec VARCHAR(3) .
Il semble que pour l'expression 'xy'+NULL la longueur perçue peut être calculée comme 'xy' longueur de chaîne (2) plus 1 pour chaque NULL ajoutée. Par exemple, tapez 'xy'+NULL+NULL est VARCHAR(4) , tapez pour 'xy'+NULL+NULL+NULL est VARCHAR(5) et ainsi de suite - consultez ce SQLFiddle
. C'est extrêmement bizarre, mais c'est ainsi que fonctionnent MS SQL Server 2008 et 2012.