Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

MSSQL cast( [varcharColumn] to int) em SELECT é executado antes que a cláusula WHERE filtre valores inválidos


Primeiro, este não é um "problema de design gritante". SQL é uma linguagem descritiva da saída, não uma linguagem procedural que especifica como o processamento está sendo feito. Não há garantia da ordem de processamento, em geral, e isso é uma vantagem. Eu poderia dizer que há um problema de design, mas é em torno do tratamento geral de exceções em instruções SQL.

De acordo com a documentação do SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), você pode depender da ordem de avaliação para uma instrução CASE para expressões escalares . Então, o seguinte deve funcionar:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)

Ou, para chegar mais perto de uma expressão "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)

Pelo menos seu código está fazendo um CAST explícito. Essa situação é muito mais desagradável quando as conversões são implícitas (e existem centenas de colunas).