Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi T-SQL ISNULL() tronque-t-il la chaîne et COALESCE ne l'est-il pas ?

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.