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.