- - PR -
SQLServer2005 Cast 文字列を数値に変換するには?
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-02-12 19:29
お世話になっております
SQL SERVER 2005 のsqlで 文字列を数値に変換したいのですが変換できないエラーが出ます 具体的には Numeric(10.5)---->Varchar-------->Numeric という風に 属性を一旦 Varchar にて取り出した後 また数値として比較チェックを行い文字列として 取得したいのですが・・・・・ 100.0000 という数値を bigint や numeric に Cast してみたのですが 変換できないエラーが出ます Convert してみてもだめでした・・・??? MSオンラインには [url=http://msdn2.microsoft.com/ja-jp/library/ms187928.aspx[/url] 「切り捨てと丸め処理の結果」の最後に 「数値ではない char、nchar、varchar、または nvarchar 型のデータが int、float、numeric、または decimal 型に変換されるとき、SQL Server では エラー メッセージが返されます。SQL Server では、空文字列 (" ") が numeric または decimal 型に変換されるときにもエラーが返されます。」 とあるのですが・・・・ 小数点は数値扱いされないのでしょうか? ご教授の程 よろしくお願いします すみません 間違えて2度アップしてしまったので 1本は削除しました [ メッセージ編集済み 編集者: 七 編集日時 2008-02-12 20:33 ] | ||||
|
投稿日時: 2008-02-12 20:37
select cast('100.00000' as numeric(10,5))
↑これも select cast(cast(100.00000 as varchar(10)) as numeric(10,5)) ↑これも ?うまくいきますけどね。 select 項目の実際のデータに文字列が入っているのでは? select [項目] from [テーブル] where isnumeric([項目]) = 0 などでチェックしてみてはいかがでしょうか | ||||
|
投稿日時: 2008-02-12 21:38
よっし〜。さん ありがとうございます
いろいろ試してみたんですが・・・ 確かに、おっしゃる通り、文字列・日付・数値と3種の データが 入っています 属性別の3種の列から 一旦 VarChar の列に取りまとめたものから 数値のものだけ数値比較をしています
簡単なSQLを作成して 試してみました 以下のSQL文の 中の Select のみを実行すると 変換中のオーバーフローのメッセージが出るものの 結果は返ってきました 下記のように SELECT の入れ子にしてしまうと 変換エラーになってしまいます ちなみに AValue の値は 111.11100 222.00000 という値が入っています Test というテーブルは ビューです このビューの中で Varchar列、Datetime列、Numeric(10,5)列 の値を、 Avalue列として 取りまとめています SELECT nu, AValue FROM (SELECT CAST(AValue AS numeric(10, 5)) AS nu, AValue FROM Test WHERE (isnumeric(AValue) = 1) ) AS d WHERE (nu > 1111.00000) 今回 UNIONにてデータを連結したものに対して データを抽出せねばならなかったので こんな入れ子になってしまいました・・・・ すみません 情報が足りない状態でした よろしくお願いいたします | ||||
|
投稿日時: 2008-02-13 13:07
SELECT * FROM TESTA
を実行した時点でエラーになったりしませんか? | ||||
|
投稿日時: 2008-02-14 15:43
よっし〜。さん 返信、有難うございます
昨日はお休みを頂いていたので 連絡が遅くなってしまい 申し訳ありません
1、SELECT * FROM TEST 2、SELECT * FROM( SELECT * FROM TEST WHERE (isnumeric(AValue) = 1) ) AS d 共に エラーにはなりません ちなみに AValue には NULL または 数値の入った行が存在します 1つの行で 属性にわけて 値を持っています 属性 Num_Value(Type=Numeric) Char_Value(Type=Varchar) ---------------------------------------------------------------------------- 行A N 1111.0000 Null 行B C Null XXXXXXXXXX このテーブルを 属性 AValue(Type=Varchar) --------------------------------------------- 行A N 1111.0000 行B C XXXXXXXXXX 変換した テンポラリテーブルにて 条件チェックを入れてました 元のテーブルでチェックをすれば CASTする必要がないので うまくいくのですが 全体的には 都合が悪かったりするので、悩みどころです | ||||
|
投稿日時: 2008-02-14 20:54
現象確認できました。 WHERE (cast(nu as numeric(10, 5)) > 1111.00000) としてみてもたしかにダメでしたが。 WHERE (cast(nu as numeric(11, 5)) > 1111.00000) としてみてください。 おそらく大丈夫です。 >自己補足 ただし、なぜこうなるのかは調査する必要がありますね。 (Cast時の丸めの問題だろうことしか予測できません。) [ メッセージ編集済み 編集者: よっし〜。 編集日時 2008-02-18 09:14 ] | ||||
|
投稿日時: 2008-02-17 00:47
遅くなりました ありがとうございました うまくいきました |
1