Pertama, ini bukan "masalah desain yang mencolok". SQL adalah bahasa deskriptif output, bukan bahasa prosedural yang menentukan bagaimana proses dilakukan. Tidak ada jaminan urutan pemrosesan, secara umum, dan ini merupakan keuntungan. Saya mungkin mengatakan ada masalah desain, tetapi itu seputar penanganan umum pengecualian dalam pernyataan SQL.
Menurut dokumentasi SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), Anda dapat bergantung pada urutan evaluasi untuk pernyataan CASE untuk ekspresi skalar . Jadi, yang berikut ini harus berfungsi:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
Atau, untuk mendekati ekspresi "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)
Setidaknya kode Anda melakukan CAST eksplisit. Situasi ini jauh lebih buruk ketika pemerannya tersirat (dan ada ratusan kolom).