För det första är detta inte ett "uppenbart designproblem". SQL är ett beskrivande språk för utdata, inte ett procedurspråk som specificerar hur bearbetning görs. Det finns ingen garanti för bearbetningsordningen i allmänhet, och detta är en fördel. Jag kan säga att det finns ett designproblem, men det handlar om den allmänna hanteringen av undantag i SQL-satser.
Enligt SQL Server-dokumentationen (http://msdn.microsoft.com/en-us/library/ms181765.aspx) kan du lita på evalueringsordningen för en CASE-sats för skalära uttryck . Så följande borde fungera:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
Eller för att komma närmare ett "int"-uttryck:
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 kod gör åtminstone en explicit CAST. Den här situationen är mycket otäckare när rollbesättningarna är implicita (och det finns hundratals kolumner).