2016-06-23 9 views
0

質問がありますnvarcharのデータを持つSQL Server列をfloatに変換するにはどうすればよいですか?nvarcharからfloatに完全な列を変換する

クラシッククエリ:

ALTER TABLE <column> 
ALTER COLUMN <column> FLOAT; 

は空の列でのみ動作します。

これを行う方法はありますか?

ありがとうございます!

+4

、新しいfloat列を追加し、データをコピーし、古い列を削除し、新しい列の名前を変更? – jarlh

+0

あなたのコードはほぼ正確です。ちょうど最初のをtablenameに置き換えてください。 – GuidoG

+0

私は54の列にデータ型を変更する必要があります。私はもっ​​と自動のものが必要だと思います。 – michal

答えて

0

は、次の構文を使用する必要があります。

ALTER TABLE table_name 
ALTER COLUMN column_name datatype 
+0

これはすでに使用しています、適切に質問をお読みください –

+0

同じ問題です。 – michal

+0

私はこのスクリプトをしようとすると、私は正しく –

1

通常の古典的なクエリでは、偶数列のデータだけでなく、空のものを持って動作します。しかし、問題は、Nvarchar列に互換性のないデータがある場合に発生します。だから、最良のオプションは、新しいテーブルを作成したり、新しい列を作成し、Try_Convertを使用することです。..

これは動作します(唯一のSQL Server 2012から) :

create table #t 
(
    id nvarchar(3) 
) 

insert into #t 
    select 1 
    union all 
    select 2 

alter table #t 
alter column id float--this works 

これは失敗します。

create table #t 
(
    id nvarchar(3) 
) 

insert into #t 
select 1 
union all 
select 2 

insert into #t 
select 'a' 

alter table #t 
alter column id float--this fails 

try_convertを使用し、互換性のないデータであるNULL値を決定するのが最も良い方法です

create table #t1 
(
    id float 
) 

insert into #t1 
    select try_convert(float, id) 
    from #t 

更新:

あなたは以下のSQL Server 2008 R2または上にある場合は、代わりにTRY_Convertのこの技術を使用することができます。 Mikael excellent answer

declare @T table 
(
    Col varchar(50) 
) 

insert into @T values 
('1'), 
('1.1'), 
('1,1'), 
('1a') 

select cast('' as xml).value('sql:column("Col") cast as xs:decimal ?', 
          'decimal(28,10)') as Col 
from @T 

出力から取り出さ:

Col 
------------- 
1.0000000000 
1.1000000000 
NULL 
NULL 
+0

それを読めば、彼はのALTER TABLE colum_nameを使用していません:#t1の に挿入テーブル#t1の ( IDフロート ) を作成するが、そうでは#tから(フロート、ID)try_convertを選択新しいテーブルは値です。 – michal

+0

新しいテーブルは1,2、ヌル値 – TheGameiswar

+1

です。 'TRY_CONVERT'はSQL Server ** 2012 ** **の新機能**です。以前のバージョンのユーザーは利用できません。 SQL Server –

関連する問題