[英]Why this query doesn't work?
为什么下面的查询在SQL Server 2008中不起作用?
SELECT
CONVERT(INT, TEMP.observ_value) AS value
FROM
(SELECT observ_value
FROM LAB_RESULTS
WHERE observ_value NOT LIKE '%[^0-9]%') TEMP
WHERE
observ_value >= 190
这是错误:
消息245,第16级,状态1,第5行
将varchar值“ SCREEN”转换为数据类型int时,转换失败。
observ_value
列是varchar
。 但是,我已经只选择了子查询中的int
值。
不幸的是,SQL Server查询优化器可以并且将以可能导致引入原始查询中没有的错误的方式重新排列查询中的项目。 这在很大程度上取决于所使用的精确查询计划,这不仅取决于表定义和查询文本,还取决于您的值如何分配。
在您的情况下,SQL Server可能会检查observ_value >= 190
,将observ_value
隐式转换为int
,然后再检查observ_value NOT LIKE '%[^0-9]%'
。 这是否是对查询的有效重新排序是有争议的,但是即使它无效,这也是SQL Server要做的事情,您必须解决。
重新编写查询,以确保无法将非数字值转换为int
:
SELECT
TEMP.observ_value AS value
FROM
(SELECT CASE
WHEN observ_value NOT LIKE '%[^0-9]%'
THEN CONVERT(INT, observ_value) END
AS observ_value
FROM LAB_RESULTS
WHERE observ_value NOT LIKE '%[^0-9]%') TEMP
WHERE
observ_value >= 190
您可以使用ISNUMERIC函数
SELECT CONVERT(INT, observ_value) AS value
FROM LAB_RESULTS
WHERE ISNUMERIC(observ_value)= 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.