web-dev-qa-db-ja.com

tSQL-整数以外のすべてでvarcharから数値への変換が機能する

varchar(255)フィールドに数値を持つテーブルがあります。これらはすべて1より大きく、小数点以下が複数あります。それらを整数に変換したいと思います。 StackOverflowのこのサイト を含め、私が相談したすべてのWebサイトによると、これらのいずれかが機能するはずです。

_SELECT CAST(VarcharCol AS INT) FROM MyTable

SELECT CONVERT(INT, VarcharCol) FROM MyTable
_

これらは両方ともあらゆる種類の数値に対して機能しますが、integer-floatdecimalなどに変換できますが、integerは次のエラーを表示します。

_Conversion failed when converting the varchar value '7082.7758172' 
to data type int.
_

データ型Decimal(6,0)に変換することで問題を回避しましたが、これは正常に機能します。しかし、私の教育のために、データ型int(またはinteger)に変換するとエラーが発生する理由を教えてください。ありがとう。

9
Stanton

データの損失を防ぐために、小数点の右側に数字がある場合、VARCHAR値のINTへの変換は失敗します。

最初にFLOATに変換してからINTに変換すると、変換が機能します。

SELECT CAST(CAST('7082.7758172' as float) as int)

返す

7082
15
Max Vernon

実際、数字があるかどうかは関係ありません。 。 (ドット)は、intにキャストする場合は禁止されています。ドットは-論理的に-整数定義の一部にはなれません。

select cast ('7.0' as int)
select cast ('7.' as int)

失敗しますが、両方ともフロートには適しています。

2
nimdil

これを試して

declare @v varchar(20)
set @v = 'Number'
select case when isnumeric(@v) = 1 then @v
else @v end

そして

declare @v varchar(20)
set @v = '7082.7758172'
select case when isnumeric(@v) = 1 then @v
else convert(numeric(18,0),@v) end
0
Gayathri L