sql >> Database >  >> RDS >> Sqlserver

Waarom kapt T-SQL ISNULL() de string af en COALESCE niet?

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.



  1. Is het mogelijk om te bestellen op het totaal aantal van meerdere tafels?

  2. Toon alle huidige sloten van get_lock

  3. Voeg een genummerde lijstkolom toe aan een geretourneerde MySQL-query

  4. MySQL DAYOFWEEK() - mijn week begint met maandag