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.