Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum schneidet T-SQL ISNULL() die Zeichenfolge ab und COALESCE nicht?

Laut Microsoft Dokumentation , für Funktion:

ISNULL(check_expression, replacement_value)

replacement_value muss von einem Typ sein, der implizit in den Typ von check_expression konvertierbar ist . Beachten Sie diesen Typ für 'xy'+NULL ist VARCHAR(3) . Aus diesem Grund Ihre Zeichenfolge 'ABCDEFGHIJ' wird in VARCHAR(3) umgewandelt und somit getrimmt.

Es klingt seltsam, warum es nicht VARCHAR(2) ist , aber so ist es - ein Zeichen länger als 'xy' . Sie können mit diesem SQLFiddle spielen und überzeugen Sie sich selbst von diesem Typ für 'xy'+NULL ist dasselbe wie für den Ausdruck CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , was NULL ist ist aber implizit kompatibel zu VARCHAR(3) .

Es scheint, dass für den Ausdruck 'xy'+NULL Die wahrgenommene Länge kann als 'xy' berechnet werden Zeichenfolgenlänge (2) plus 1 für jeden NULL hinzugefügt. Geben Sie beispielsweise 'xy'+NULL+NULL ein ist VARCHAR(4) , geben Sie für 'xy'+NULL+NULL+NULL ein ist VARCHAR(5) und so weiter - sehen Sie sich dieses SQLFiddle an . Das ist extrem seltsam, aber so funktionieren MS SQL Server 2008 und 2012.