sql >> Database teknologi >  >> RDS >> Sqlserver

MSSQL cast ([varcharColumn] til int) i SELECT bliver udført, før WHERE-sætningen bortfiltrerer dårlige værdier

For det første er dette ikke et "oplagt designproblem". SQL er et beskrivende sprog for outputtet, ikke et proceduresprog, der specificerer, hvordan bearbejdning udføres. Der er generelt ingen garanti for rækkefølgen af ​​behandlingen, og det er en fordel. Jeg vil måske sige, at der er et designproblem, men det er omkring den generelle håndtering af undtagelser i SQL-sætninger.

I henhold til SQL Server-dokumentationen (http://msdn.microsoft.com/en-us/library/ms181765.aspx), kan du afhænge af evalueringsrækkefølgen for en CASE-sætning til skalære udtryk . Så følgende burde virke:

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

Eller for at komme tættere på et "int"-udtryk:

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)

Din kode laver i det mindste en eksplicit CAST. Denne situation er meget mere grim, når rollebesætningerne er implicitte (og der er hundredvis af kolonner).



  1. Sådan slettes eller slettes alle triggere fra en database i SQL Server

  2. django.db.utils.OperationalError:(2013, Mistet forbindelse til MySQL-serveren ved 'håndtryk:læser initial kommunikationspakke', systemfejl:0)

  3. SYSUTCDATETIME() vs GETUTCDATE() i SQL Server:Hvad er forskellen?

  4. Spring Data-forespørgsel fungerer ikke, når forespørgselsparameter er en enhed