算术溢出错误仅在WHERE中将varchar转换为数据类型numeric

时间:2014-12-09 16:45:57

标签: sql-server-2008 tsql

我有这个问题......

SELECT  
    CONVERT(NUMERIC(8, 2), ResultLevel),
    *
FROM    
    dbo.DrugTestResult
WHERE   
    DrugID = 'THC'
    AND ISNUMERIC(ResultLevel) = 1
    AND (CONVERT(NUMERIC(8, 2), ResultLevel) >= 50
         AND CONVERT(NUMERIC(8, 2), ResultLevel) <= 99999)
    AND CONVERT(DATE, AuditStamp) > '2014-1-1'

返回此错误

  

将varchar转换为数据类型numeric

的算术溢出错误

当我评论where子句的这一部分时

AND ( CONVERT(NUMERIC(8, 2), ResultLevel) >= 50
      AND CONVERT(NUMERIC(8, 2), ResultLevel) <= 99999
    )

返回数据集。

所以问题是CONVERT为什么在SELECT中工作,而在WHERE子句中却没有?

2 个答案:

答案 0 :(得分:3)

因为可以按查询处理引擎认为合适的任何顺序来评估WHERE子句的不同元素,所以它可以在评估ISNUMERIC()之前尝试评估CONVERT()。因此,它可以尝试转换无法转换的数据。

另一方面,SELECT列表是在WHERE子句之后计算的,因此ISNUMERIC()已经消除了无法转换的值。

为了避免您的错误,您可以将ISNUMERIC()放在内部派生表上,这样您只能尝试CONVERT()外部WHERE子句中的数字数据。

答案 1 :(得分:0)

因为有一个或多个记录无法按要求转换。如果在SSMS中运行查询,它将仅对结果集中显示的行执行select子句中的转换,同时对结果集中的所有行执行where子句,以确定结果集中包含哪些行。要对此进行测试,您可以执行查询(不使用where子句)并向下滚动:一旦到达弄乱您的行,您将收到转换错误。

希望这能回答你的问题并解释这种行为。