我的问题似乎很简单,但我被困在这里。我有一个表,其中有一个名为“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”时,我的查询正常运行。我应该在此声明中添加其他内容吗?
请帮助我解决这个问题。提前致谢!!
您不能指望数据库计算过滤表达式的顺序。有一个查询优化器将评估您的 SQL 并根据其感知的结果构建执行查询的计划最棒的表演.
在此背景下,IsNumeric()
不能与索引一起使用,这意味着对表中的每一行运行一个函数。因此,它将几乎从不提供最佳的感知性能。将此与SrcID > 15
表达式,它可以与索引(如果存在)匹配,并且只是一个运算符表达式,即使不存在。它还可用于过滤潜在的行数,其中IsNumeric()
函数需要运行。
您可以使用视图、子查询、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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)