sql-server-2008 – SQL Server JOIN中的IsNumeric

我的问题似乎很简单,但我被困在这里.我有一个表有一个名为“SrcID”的“nvarchar”列,我存储了数字和字符串.现在,当我尝试在“加入”条件下检查该列上的“IsNumeric”时,如下所示,

   ISNUMERIC(SrcID) = 1 AND SrcID > 15

我收到以下错误:

  Msg 245, Level 16, State 1, Line 47
  Conversion failed when converting the nvarchar value 'Test' to data type int.

令人惊讶的是,当我删除支票“SrcID> 15”时,我的查询运行正常.我应该在此声明中包含其他内容吗?

请帮我解决问题.提前致谢!!

最佳答案
您不能指望数据库评估过滤表达式的顺序.有一个查询优化器将评估您的查询并构建一个计划,以根据最佳性能执行您的查询.表达式SrcID> 15可以与索引匹配,但IsNumeric(SrcID)= 1不能与索引匹配,因此SrcID> 1. 15可能首先被评估,因为它有助于更​​快地过滤掉更多的潜在记录.

您可以使用视图,子查询,CTE,CASE语句或计算列来解决此问题.这是一个CTE示例:

With NumericOnly As 
(
    SELECT <columns> FROM MyTable WHERE IsNumeric(SrcID) = 1
)
SELECT <columns> FROM NumericOnly WHERE SrcID > 15

这是一个CASE语句选项:

SELECT <columns> FROM MyTable WHERE CASE WHEN IsNumeric(SrcIC) = 1 THEN Cast(SrcID As Int) ELSE 0 END > 15

转载注明原文:sql-server-2008 – SQL Server JOIN中的IsNumeric - 代码日志