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.