Ifølge Microsofts dokumentation , for funktion:
ISNULL(check_expression, replacement_value)
replacement_value skal være af en type, der implicit kan konverteres til typen check_expression . Bemærk denne type for 'xy'+NULL er VARCHAR(3) . På grund af dette din streng 'ABCDEFGHIJ' er castet til VARCHAR(3) og dermed trimmet.
Det lyder mærkeligt, hvorfor det ikke er VARCHAR(2) , men sådan er det - et tegn længere end 'xy' . Du kan spille med denne SQLFiddle
og se selv den type for 'xy'+NULL er det samme som for udtryk CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , som er NULL men er implicit kompatibel med VARCHAR(3) .
Det ser ud til, at for udtrykket 'xy'+NULL opfattet længde kan beregnes som 'xy' strenglængde (2) plus 1 for hver NULL tilføjet. Skriv f.eks. 'xy'+NULL+NULL er VARCHAR(4) , skriv for 'xy'+NULL+NULL+NULL er VARCHAR(5) og så videre - tjek denne SQLFiddle
. Det er ekstremt underligt, men det er sådan MS SQL Server 2008 og 2012 fungerer.