sql >> Database teknologi >  >> RDS >> Sqlserver

Hvorfor trunkerer T-SQL ISNULL() strengen, og COALESCE gør det ikke?

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.



  1. Jeg har opgraderet SQL Server ODBC-driveren, og ydeevnen er blevet negativt påvirket. Hvad kan jeg gøre?

  2. Tilslutning til en Oracle-database ved hjælp af SQLAlchemy

  3. PostgreSQL søg og erstat where condition

  4. MySQL EXP() Funktion – Returner e hævet til x-potensen