Enligt Microsofts dokumentation , för funktion:
ISNULL(check_expression, replacement_value)
replacement_value
måste vara av en typ som är implicit konverterbar till typen check_expression
. Observera den typen för 'xy'+NULL
är VARCHAR(3)
. På grund av detta är din sträng 'ABCDEFGHIJ'
castas till VARCHAR(3)
och därmed trimmad.
Det låter konstigt varför det inte är VARCHAR(2)
, men så här är det - ett tecken längre än 'xy'
. Du kan spela med denna SQLFiddle
och se själv den typen för 'xy'+NULL
är samma som för uttrycket CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END
, som är NULL
men är implicit kompatibel med VARCHAR(3)
.
Det verkar som om uttrycket 'xy'+NULL
upplevd längd kan beräknas som 'xy'
stränglängd (2) plus 1 för varje NULL
Lagt till. Typ till exempel 'xy'+NULL+NULL
är VARCHAR(4)
, skriv för 'xy'+NULL+NULL+NULL
är VARCHAR(5)
och så vidare - kolla in denna SQLFiddle
. Det här är extremt konstigt, men det är så MS SQL Server 2008 och 2012 fungerar.