Volgens Microsoft documentatie , voor functie:
ISNULL(check_expression, replacement_value)
replacement_value moet van een type zijn dat impliciet converteerbaar is naar het type check_expression . Merk op dat type voor 'xy'+NULL is VARCHAR(3) . Hierdoor is je string 'ABCDEFGHIJ' wordt gecast naar VARCHAR(3) en dus getrimd.
Het klinkt vreemd waarom het niet VARCHAR(2) is , maar zo is het - één teken langer dan 'xy' . Je kunt met deze SQLFiddle
spelen en zie zelf dat type voor 'xy'+NULL is hetzelfde als voor uitdrukking CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , dat is NULL maar is impliciet compatibel met VARCHAR(3) .
Het lijkt erop dat voor uitdrukking 'xy'+NULL waargenomen lengte kan worden berekend als 'xy' stringlengte (2) plus 1 voor elke NULL toegevoegd. Typ bijvoorbeeld 'xy'+NULL+NULL is VARCHAR(4) , typ voor 'xy'+NULL+NULL+NULL is VARCHAR(5) enzovoort - bekijk deze SQLFiddle
. Dit is heel raar, maar zo werken MS SQL Server 2008 en 2012.