Đầu tiên, đây không phải là "vấn đề thiết kế chói mắt". SQL là một ngôn ngữ mô tả của đầu ra, không phải là một ngôn ngữ thủ tục chỉ định cách thức thực hiện đánh giá. Nói chung, không có gì đảm bảo về thứ tự xử lý và đây là một lợi thế. Tôi có thể nói rằng có một vấn đề thiết kế, nhưng đó là vấn đề xung quanh việc xử lý chung các ngoại lệ trong các câu lệnh SQL.
Theo tài liệu SQL Server (http://msdn.microsoft.com/en-us/library/ms181765.aspx), bạn có thể phụ thuộc vào thứ tự loại bỏ cho câu lệnh CASE cho biểu thức vô hướng . Vì vậy, những điều sau sẽ hoạt động:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
Hoặc, để đến gần hơn với biểu thức "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)
Ít nhất mã của bạn đang thực hiện một CAST rõ ràng. Tình huống này còn tệ hơn nhiều khi các phôi ẩn (và có hàng trăm cột).