Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SELECT CASE CAST Грешка при преобразуване

Не можете да смесвате типове данни в CASE изрази (или поне без да внимавате, че имплицитно ще изведат OK)

когато се сблъска с израз като следния, SQL Server ще използва приоритет на типа данни, за да определи какъв трябва да бъде общият тип данни на израза

SELECT CASE WHEN 1=1 THEN 'not-a-date' ELSE getdate() END

За горния datetime има по-висок приоритет от char така че неявно прехвърля низа към дата, която е неуспешна.

Следното обаче успява като sql_variant има по-висок приоритет

SELECT CASE WHEN 1=1 THEN cast('not-a-date' as sql_variant) ELSE getdate() END

Така че можете да върнете множество смесени типове данни по този начин (не съм сигурен колко лесно е sql_variant трябва да се работи с него)

Освен това можете да върнете NULL за невалидни дати и часове, вместо да връщате безсмислените данни или преобразувайте всичко в низ, ако трябва да го върнете.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да посочите номер на порт в низа за връзка на SQL Server?

  2. Как да преместите/копирате всички бази данни с потребители, схема и роли от един сървър на друг

  3. Работа с данни на Salesforce.com в SQL Server Reporting Services

  4. Избор от таблица, където името се предава като променлива

  5. Използване на Temp таблици в SSIS