sql >> Database >  >> RDS >> Sqlserver

MSSQL cast( [varcharColumn] naar int) in SELECT wordt uitgevoerd voordat de WHERE-component slechte waarden uitfiltert

Ten eerste is dit geen "in het oog springend ontwerpprobleem". SQL is een beschrijvende taal van de uitvoer, geen proceduretaal die aangeeft hoe de verwerking wordt uitgevoerd. Er is geen garantie voor de volgorde van verwerking in het algemeen, en dit is een voordeel. Ik zou kunnen zeggen dat er een ontwerpprobleem is, maar het gaat om de algemene afhandeling van uitzonderingen in SQL-instructies.

Volgens de SQL Server-documentatie (http://msdn.microsoft.com/en-us/library/ms181765.aspx), kunt u vertrouwen op de volgorde van evauatie voor een CASE-instructie voor scalaire expressies . Dus het volgende zou moeten werken:

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

Of, om dichter bij een "int"-uitdrukking te komen:

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)

Je code doet tenminste een expliciete CAST. Deze situatie is veel erger wanneer de afgietsels impliciet zijn (en er zijn honderden kolommen).



  1. Failover-opties voor multi-cloud volledige databasecluster voor MariaDB-cluster

  2. Databasetabellen, meer hoe beter?

  3. Hernoem Amazon RDS-tabelnaam naar hoofdletter geeft fout

  4. SQL:Is het mogelijk om velden van het type INTERVAL te SOM()?