我有这个问题......
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
子句中却没有?
答案 0 :(得分:3)
因为可以按查询处理引擎认为合适的任何顺序来评估WHERE子句的不同元素,所以它可以在评估ISNUMERIC()之前尝试评估CONVERT()。因此,它可以尝试转换无法转换的数据。
另一方面,SELECT列表是在WHERE子句之后计算的,因此ISNUMERIC()已经消除了无法转换的值。
为了避免您的错误,您可以将ISNUMERIC()放在内部派生表上,这样您只能尝试CONVERT()外部WHERE子句中的数字数据。
答案 1 :(得分:0)
因为有一个或多个记录无法按要求转换。如果在SSMS中运行查询,它将仅对结果集中显示的行执行select子句中的转换,同时对结果集中的所有行执行where子句,以确定结果集中包含哪些行。要对此进行测试,您可以执行查询(不使用where子句)并向下滚动:一旦到达弄乱您的行,您将收到转换错误。
希望这能回答你的问题并解释这种行为。