3

VARCHAR(255) 型の列を持つ SQL Server 2000 データベースがあります。すべてのデータは NULL、または精度が 2 ポイントまでの数値データです (例: '11.85')。次の T-SQL クエリを実行しようとしましたが、「データ型 varchar を数値に変換中にエラーが発生しました」というエラーが表示されました。

SELECT CAST([MyColumn] AS DECIMAL)
FROM [MyTable];

より具体的なキャストを試みましたが、これも失敗しました。

SELECT CAST([MyColumn] AS DECIMAL(6,2))
FROM [MyTable];

また、次のことを試して、数値以外のデータがあるかどうかを確認しましたが、返された値は NULL だけでした。

SELECT ISNUMERIC([MyColumn]), [MyColumn]
FROM [MyTable]
WHERE ISNUMERIC([MyColumn]) = 0;

FLOAT や MONEY など、他のデータ型に変換しようとしましたが、MONEY だけが成功しました。だから私は次のことを試しました:

SELECT CAST(CAST([MyColumn] AS MONEY) AS DECIMAL)
FROM [MyTable];

...うまくいきました。元のクエリが失敗した理由はありますか? 最初に MONEY に変換してから DECIMAL に変換すると問題はありますか?

ありがとう!

4

3 に答える 3

17

これは、小数点記号がコンマかドットかによって異なる可能性があります。以下は、いくつかのテスト クエリとその結果です。

select CAST('3.6' as decimal) -- 3.60
select CAST('3,6' as decimal) -- Error converting data type varchar to numeric.
select CAST('3.6' as money) -- 3.60
select CAST('3,6' as money) -- 36.00 (!)
select ISNUMERIC('3.6') -- 1
select ISNUMERIC('3,6') -- 1

ISNUMERICのドキュメントには次のように書かれています。

ISNUMERIC は、入力式が有効な整数、浮動小数点数、金額、または小数型に評価される場合に 1 を返します。それ以外の場合は 0 を返します

と の両方3.63,6にキャストできるmoneyため、 がisnumeric('3,6')返されます1

この問題を解決するには、コンマをドットに置き換えます (または、システムが小数点記号としてコンマを使用している場合はその逆):

select cast(replace('3,6',',','.') as decimal)

もう 1 つのオプションは、Windows の「小数点記号」を変更することです。これは、構成パネル -> 地域と言語 -> 形式 -> 追加設定 -> 番号にあります。

于 2010-04-07T00:01:00.097 に答える
3

別の原因は空の文字列です。たとえば、インポート ウィザードを使用して CSV ファイルをインポートすると、空のフィールドは null ではなく空の文字列になります。

これは、これを修正するための一般的なイディオムです。

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))
于 2013-07-11T21:43:30.010 に答える
0

CAST(isnull(MyColumn,0) as Decimal(4,2)) FROM [MyTable]; を選択します。

于 2010-04-07T09:40:08.783 に答える