Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

MSSQL cast( [varcharColumn] to int) in SELECT wird ausgeführt, bevor die WHERE-Klausel fehlerhafte Werte herausfiltert

Erstens ist dies kein "eklatantes Designproblem". SQL ist eine beschreibende Sprache der Ausgabe, keine prozedurale Sprache, die angibt, wie die Verarbeitung durchgeführt wird. Es gibt im Allgemeinen keine Garantie für die Reihenfolge der Verarbeitung, und dies ist ein Vorteil. Ich könnte sagen, es gibt ein Designproblem, aber es geht um die allgemeine Behandlung von Ausnahmen in SQL-Anweisungen.

Gemäß der SQL Server-Dokumentation (http://msdn.microsoft.com/en-us/library/ms181765.aspx) können Sie sich auf die Auswertungsreihenfolge für eine CASE-Anweisung für skalare Ausdrücke verlassen . Folgendes sollte also funktionieren:

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

Oder, um einem "int"-Ausdruck näher zu kommen:

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)

Zumindest macht Ihr Code einen expliziten CAST. Diese Situation ist viel unangenehmer, wenn die Umwandlungen implizit sind (und es Hunderte von Spalten gibt).