【发布时间】:2012-10-31 15:20:21
【问题描述】:
下面是我正在使用的表结构和数据的子集。
CREATE TABLE #Test
(
Val varchar(5)
,Type varchar(5)
)
INSERT #Test VALUES ('Yes','Text')
INSERT #Test VALUES ('10','Int')
INSERT #Test VALUES ('10.00','Float')
INSERT #Test VALUES ('9.00','Float')
INSERT #Test VALUES ('9','Int')
我想编写一个查询,让我知道列“Val”是否
SELECT *
FROM
(
SELECT Val
FROM #Test
WHERE Type = 'Int'
) IntsOnly
WHERE IntsOnly.Val <= 9.00
这给了我一个算术溢出错误。但是,如果我排除值为“10”的数据行:
SELECT *
FROM
(
SELECT Val
FROM #Test
WHERE Type = 'Int'
AND Val <> '10'
) IntsOnly
WHERE IntsOnly.Val <= 9.00
它可以正常工作。 我的问题不是如何解决这个问题,因为我知道我可以简单地将数据转换为我需要的格式。
我的问题是为什么“Val”列中的“10”值返回错误。当然,逻辑应该只返回“False”并简单地排除行,因为“10”(我假设它是隐式转换的)大于 9.00。
谢谢。
【问题讨论】:
-
算术溢出错误,你确定?不是conversion error?
-
尝试在转换中显式。
CAST(val AS DECIMAL(9,2)) <= CAST(9.00 AS DECIMAL(9,2))给了什么? -
GSerg - 是的,将 varchar 转换为数字的算术溢出。 Dems - 这确实有效!但是,我想了解为什么隐式转换不起作用?我的想法是它可以进行这种转换并且不应该引起问题?
-
无论如何,这都不是一种安全的查询方式。见SQL Server should not raise illogical errors。尽管使用了子查询,演员仍然可能被推下并针对值
Yes发生。
标签: sql sql-server-2008 tsql