問題列の値をvarchar(n)から小数点に変換する
-
25-09-2019 - |
質問
型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.6
と 3,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))を選択します。