首先,这不是一个“明显的设计问题”。SQL是输出的描述性语言,而不是指定如何进行练习的过程性语言。通常,不能保证处理顺序,这是一个优势。我可能会说存在一个设计问题,但这是有关SQL语句中异常的一般处理。
根据SQL Server文档(http://msdn.microsoft.com/zh-cn/library/ms181765.aspx),
对于标量表达式 ,您可以依赖CASE语句的评估顺序。因此,以下应该工作:
select (case when isnumeric(c.varcharColumn) = 1 then cast(c.varcharColumn as int) end)
或者,更接近“ 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)
至少您的代码正在执行显式的CAST。当强制转换是隐式的(并且有数百列)时,这种情况更加糟糕。


![在WHERe子句过滤掉错误值之前,将执行SELECT中的MSSQL cast([varcharColumn]到int) 在WHERe子句过滤掉错误值之前,将执行SELECT中的MSSQL cast([varcharColumn]到int)](http://www.mshxw.com/aiimages/31/614484.png)
