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).