Podle dokumentace společnosti Microsoft , pro funkci:
ISNULL(check_expression, replacement_value)
replacement_value musí být typu, který je implicitně převoditelný na typ check_expression . Všimněte si, že zadejte 'xy'+NULL je VARCHAR(3) . Z tohoto důvodu váš řetězec 'ABCDEFGHIJ' je přetypován na VARCHAR(3) a takto oříznuté.
Zní to divně, proč to není VARCHAR(2) , ale je to tak - o jeden znak delší než 'xy' . Můžete hrát s tímto SQLFiddle
a přesvědčte se sami o typu 'xy'+NULL je stejný jako u výrazu CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , což je NULL ale je implicitně kompatibilní s VARCHAR(3) .
Zdá se, že pro výraz 'xy'+NULL vnímanou délku lze vypočítat jako 'xy' délka řetězce (2) plus 1 za každý NULL přidal. Zadejte například 'xy'+NULL+NULL je VARCHAR(4) , zadejte 'xy'+NULL+NULL+NULL je VARCHAR(5) a tak dále – podívejte se na tento SQLFiddle
. To je extrémně divné, ale takhle fungují MS SQL Server 2008 a 2012.