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.