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.