1

我正在使用 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).

4

1 回答 1

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;

作为注释。您的表达式 forisnumeric将为 value 返回 true '-'

于 2013-07-25T14:57:39.620 回答