Po pierwsze, nie jest to „rażący problem projektowy”. SQL jest językiem opisowym danych wyjściowych, a nie językiem proceduralnym, który określa sposób przetwarzania. Ogólnie rzecz biorąc, nie ma gwarancji kolejności przetwarzania, co jest zaletą. Mogę powiedzieć, że istnieje problem z projektem, ale dotyczy on ogólnej obsługi wyjątków w instrukcjach SQL.
Zgodnie z dokumentacją SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx) możesz polegać na kolejności oceny instrukcji CASE dla wyrażeń skalarnych . Powinno więc działać:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
Lub, aby zbliżyć się do wyrażenia „int”:
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)
Przynajmniej twój kod wykonuje jawny CAST. Ta sytuacja jest znacznie bardziej nieprzyjemna, gdy rzuty są niejawne (i są setki kolumn).