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.