Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego T-SQL ISNULL() obcina ciąg, a COALESCE nie?

Według Microsoft dokumentacja , dla funkcji:

ISNULL(check_expression, replacement_value)

replacement_value musi być typu, który jest niejawnie konwertowany na typ check_expression . Zauważ, że wpisz 'xy'+NULL to VARCHAR(3) . Z tego powodu Twój ciąg 'ABCDEFGHIJ' jest rzutowany na VARCHAR(3) i tym samym przycięte.

Brzmi dziwnie, dlaczego nie jest to VARCHAR(2) , ale tak właśnie jest - o jeden znak dłuższy niż 'xy' . Możesz bawić się tym SQLFiddle i przekonaj się, że typ dla 'xy'+NULL jest takie samo jak dla wyrażenia CASE WHEN 1=2 THEN 'XYZ' ELSE NULL END , czyli NULL ale jest domyślnie kompatybilny z VARCHAR(3) .

Wygląda na to, że dla wyrażenia 'xy'+NULL postrzeganą długość można obliczyć jako 'xy' długość łańcucha (2) plus 1 dla każdego NULL dodany. Na przykład wpisz 'xy'+NULL+NULL to VARCHAR(4) , wpisz dla 'xy'+NULL+NULL+NULL to VARCHAR(5) i tak dalej - sprawdź to SQLFiddle . To bardzo dziwne, ale tak właśnie działa MS SQL Server 2008 i 2012.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Powielanie wierszy na podstawie wartości kolumny w każdym wierszu

  2. Czy można odmówić dostępu do SQL Server z określonych programów?

  3. Jak działa funkcja DIFFERENCE() SQL Server

  4. SQL Server 2008 udziela uprawnień do information_schema.columns

  5. podstawowa wstawka zbiorcza pyodbc