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返すかどうかだと思います。1CONVERT(DECIMAL(38, 0), value)

4

1 に答える 1

1

caseSQL Server は、ステートメントを除いて、式を再配置する権利を留保します。つまり、サブクエリから外部クエリに問題のある値が渡される可能性があります。

1 つの例外は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 に答える