【发布时间】:2012-05-06 17:56:38
【问题描述】:
我有一个用于解析的临时表#rp。
#rp 包含一个nvarchar(max) 列#rp.col8,它将正数和负数保存到小数点后两位,例如`1234.26'。
我能够运行以下查询并得到一组转换后的值:
select * from
(
select CONVERT(decimal(18,2),rp.col8) as PARSEAMT
from #rp
where
--#rp filtering criteria
)q
但是,当我尝试以下列方式查询 PARSEAMT = 0 时,我得到标准的“8114,将数据类型 varchar 转换为数字时出错。”:
select * from
(
select CONVERT(decimal(18,2),col8) as PARSEAMT
from #rp
where
--#rp filtering criteria
)q
where q.PARSEAMT = 0
没有where 子句,查询运行良好并生成预期值。
我也尝试过其他子句,例如 where q.PARSEAMT = 0.00 和 where q.PARSEAMT = convert(decimal(18,2),0)。
我在比较中做错了什么?
【问题讨论】:
-
SELECT MAX(PARSEAMT), MIN(PARSEAMT) 产生什么?
-
Aaron : MAX() 返回 328.90,MIN() 返回 -111.46
-
好吧,我无法重现这个问题,所以一定有一些因素没有在问题中显示出来。你能显示 CREATE TABLE #rp 吗?您确定 col8 中的所有值都是有效的十进制值吗?如果是这样,为什么列 nvarchar(max) 而不是首先使用正确的数据类型?
-
#RP 是一个包含 50 个 NVARCHAR(MAX) 列的表;它本质上是我构建的东西,在我将它们上传到更理智的东西之前,将它们保存在一种实体属性值表中。我刚刚检查了一些正则表达式,我很确定它们都适合有效的十进制格式。奇怪的是我可以使用子查询将它们转换为有效的数字(18,2)值......但是当我尝试比较转换后的值时,它会产生转换错误。
-
如果没有更简单的重现和示例数据来重现问题,您将很难让其他人为您破译问题。
标签: sql-server sql-server-2008 type-conversion