質問

型Varchar(255)の列を備えたSQL Server 2000データベースがあります。すべてのデータは、最大2ポイントの精度('11 .85 'など)のnullまたは数値データのいずれかです。次の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;

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

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

...うまくいきました。元のクエリが失敗した理由はありますか?私が最初にお金に変換してから小数に変換した場合、問題がありますか?

ありがとう!

役に立ちましたか?

解決

これは、小数シンボルがコンマかドットかに依存する可能性があります。いくつかのテストクエリとその結果は次のとおりです。

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 言う:

IS -Numericは、入力式が有効な整数、浮動小数点数、お金、または小数タイプに評価されるときに1を返します。それ以外の場合は、0を返します

両方 3.63,6 にキャストすることができます money, 、 だから isnumeric('3,6') 戻り値 1.

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

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

別のオプションは、Windowsの「小数シンボル」を変更することです。構成パネル - > regionalおよび言語 - >フォーマット - >追加設定 - >番号。

他のヒント

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

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

CAST(NULLIF([number_as_a_string],'') AS decimal(13,2))

myTable]から10進(4,2)としてcast(isnull(mycolumn、0))を選択します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top