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

MSSQL cast([varcharColumn] to int) w SELECT jest wykonywany przed klauzulą ​​WHERE odfiltrowującą złe wartości

Po pierwsze, nie jest to „rażący problem projektowy”. SQL jest językiem opisowym danych wyjściowych, a nie językiem proceduralnym, który określa sposób przetwarzania. Ogólnie rzecz biorąc, nie ma gwarancji kolejności przetwarzania, co jest zaletą. Mogę powiedzieć, że istnieje problem z projektem, ale dotyczy on ogólnej obsługi wyjątków w instrukcjach SQL.

Zgodnie z dokumentacją SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx) możesz polegać na kolejności oceny instrukcji CASE dla wyrażeń skalarnych . Powinno więc działać:

select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)

Lub, aby zbliżyć się do wyrażenia „int”:

select (case when isnumeric(c.varcharColumn) = 1 and c.varcharColumn not like '%.%' and c.varcharColumn not like '%e%'
             then cast(c.varcharColumn as int)
        end)

Przynajmniej twój kod wykonuje jawny CAST. Ta sytuacja jest znacznie bardziej nieprzyjemna, gdy rzuty są niejawne (i są setki kolumn).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sprawdź, czy tabela ma kolumnę TIMESTAMP w SQL Server za pomocą OBJECTPROPERTY()

  2. SQL, jak łączyć wyniki?

  3. Instrukcja SQL Update Replace

  4. Błąd krytyczny PHP:wywołanie niezdefiniowanej funkcji mssql_query()

  5. Użyj FILE_NAME(), aby zwrócić logiczną nazwę pliku dla danego identyfikatora pliku w SQL Server