Według Microsoft dokumentacja , dla funkcji:
ISNULL(check_expression, replacement_value)
replacement_value musi być typu, który jest niejawnie konwertowany na typ check_expression . Zauważ, że wpisz 'xy'+NULL to VARCHAR(3) . Z tego powodu Twój ciąg 'ABCDEFGHIJ' jest rzutowany na VARCHAR(3) i tym samym przycięte.
Brzmi dziwnie, dlaczego nie jest to VARCHAR(2) , ale tak właśnie jest - o jeden znak dłuższy niż 'xy' . Możesz bawić się tym SQLFiddle
i przekonaj się, że typ dla 'xy'+NULL jest takie samo jak dla wyrażenia CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , czyli NULL ale jest domyślnie kompatybilny z VARCHAR(3) .
Wygląda na to, że dla wyrażenia 'xy'+NULL postrzeganą długość można obliczyć jako 'xy' długość łańcucha (2) plus 1 dla każdego NULL dodany. Na przykład wpisz 'xy'+NULL+NULL to VARCHAR(4) , wpisz dla 'xy'+NULL+NULL+NULL to VARCHAR(5) i tak dalej - sprawdź to SQLFiddle
. To bardzo dziwne, ale tak właśnie działa MS SQL Server 2008 i 2012.