Според документация на 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.