アプリ版:「スタンプのみでお礼する」機能のリリースについて

お伺いします。

SELECT
a ,
WHEN
ISNUMERIC(b) = 1
THEN
b
ELSE
0
END AS b
into #hoge
from table

と言うSQL文があります。
型としましては、
aはdecimal(16.4)、bはnvarchar(256)とします。
bに'999999999'が入っている(9桁)場合は、
正常に値がワークテーブル#hogeに書き込まれますが、
bに'9999999999'が入っている(10桁)場合には、

「nvarchar の値 '9999999999' の変換が int 型の列でオーバーフローしました。整数値の最大値を超えました。」
と怒られてしまいます。

これは何故でしょうか?
ちなみに、文字列'9999999999'をbとして直接渡してやっても正常にワークテーブルhogeに書き込まれ、終了します。

数字の場合のみ10桁以上でも書込みを行いたいのですが、出来ずに困っています。
アドバイスありましたら宜しくお願い致します。

A 回答 (1件)

当方SQLServerとかやったことありませんが聞きかじりで



> ISNUMERIC(b)
ISNUMERIC(cast(b as bigint))

たぶん精度オーバーのように見えます。
詳しくはcastかconvert関数?
を見てみると幸せになれるかも。
    • good
    • 0
この回答へのお礼

HowOverさん
アドバイスありがとうございました。

ISNUMERIC(b) の部分では正常に行われていたのですが、どうやら
else 0 の 「0」 
が1レコード目に存在する場合、ワークテーブル定義をシステムが勝手にint型と判断してワークテーブルを作成するようです。よって、そのint型に型オーバー値を入れる事になるのでこう言う現象になるです。

ISNUMERIC(cast (b as decimal)) = 1
THEN
b
ELSE
cast(0 as decimal)
END AS b

とすれば、上手く行きました。
おっしゃる様に型の宣言はきっちり定義した方が、幸せに(^^なれそうですね。

有難う御座いました。

お礼日時:2008/04/04 08:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す