我正在使用SQL Server 2005。
我正在尝试获取整数fk_unitserial
的值。该列定义为nvarchar(255), not null
。
我想我正在从此列中选择数值并使用以下查询确定这些值是否在特定范围内:
select t.pkid, t.fk_unitserial
from (
select r.pkid, r.fk_unitserial
from tbl_ovenresults r
where isnumeric(r.fk_unitserial + '.0e0') = 1
) t
where convert(decimal(38, 0), t.fk_unitserial) between -2147483648 and 2147483647
order by t.pkid
但是运行它会给我留言:
Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.
它看起来就像有问题的值是129896545820
,但正在运行
select convert(decimal(38, 0), 129896545820)
按预期工作。
我错过了什么?
修改
我想我真正要问的是,ISNUMERIC
是否会1
返回CONVERT(DECIMAL(38, 0), value)
无法在{{1}}中使用的值。
答案 0 :(得分:1)
SQL Server保留重新排列表达式的权利,但case
语句除外。这意味着您可以将从子查询传递到外部查询的违规值。
一个例外是case
语句,其中通常遵循顺序评估(当涉及聚合表达式时存在星号,但这不是问题)。我建议:
select r.pkid, r.fk_unitserial
from tbl_ovenresults r
where (case when r.fk_unitserial not like '[^0-9]' then convert(decimal(38, 0), t.fk_unitserial) end)
between -2147483648 and 2147483647
order by t.pkid;
作为一个说明。 isnumeric
的表达式将为值'-'
返回true。