Според документация на Microsoft , за функция:
ISNULL(check_expression, replacement_value)
replacement_value трябва да бъде от тип, който имплицитно може да се преобразува в типа на check_expression . Обърнете внимание, че въведете за 'xy'+NULL е VARCHAR(3) . Поради това вашият низ 'ABCDEFGHIJ' се прехвърля към VARCHAR(3) и по този начин подрязан.
Звучи странно защо не е VARCHAR(2) , но това е начина - един знак по-дълъг от 'xy' . Можете да играете с този SQLFiddle
и вижте сами този тип за 'xy'+NULL е същото като за израз CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , което е NULL но е имплицитно съвместим с VARCHAR(3) .
Изглежда, че за израз 'xy'+NULL възприетата дължина може да се изчисли като 'xy' дължина на низ (2) плюс 1 за всеки NULL добавен. Например въведете 'xy'+NULL+NULL е VARCHAR(4) , въведете за 'xy'+NULL+NULL+NULL е VARCHAR(5) и така нататък - вижте този SQLFiddle
. Това е изключително странно, но така работят MS SQL Server 2008 и 2012.