如何从SQL查询中的NVARCHAR列中选择整数值?

时间:2013-07-25 14:33:03

标签: sql sql-server sql-server-2005

我正在使用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}}中使用的值。

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。