sql >> Databasteknik >  >> RDS >> Sqlserver

Varför trunkerar T-SQL ISNULL() strängen och COALESCE gör det inte?

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.



  1. 2 sätt att få det korta månadsnamnet från ett datum i MariaDB

  2. 5 sätt att kontrollera om en tabell finns i PostgreSQL

  3. Finns det något sätt att bara begränsa det lägre intervallet i mysql?

  4. Kör PostgreSQL vissa prestandaoptimeringar för skrivskyddade transaktioner