2012-05-18 17 views
10

私は誤って宣言されていると思われる列があります。それにはデータが含まれており、データを失うことは望ましくありません。データを削除せずにデータで列の型を変更する

定義をvarchar(max)からvarchar(整数)に変更したいとします。私は列の種類を変えることはできないという印象を受けましたか?

一時カラム "column2"を作成する最も良い方法は、問題のあるタイプのカラムからこのカラムにデータを転送し、問題のカラムを削除して、一時カラムを元の問題のあるカラムに変更しますか?

もしそうなら、問題の列の値を新しい列にコピーするにはどうすればよいですか?

EDIT:同じ問題が発生した場合は、を入力するだけでALTER文を使用できます。

答えて

16

データ型が多少「関連」している限り、あなたは絶対にこれを行うことができます。

BIGINTに変更することができます。第2のタイプの値の範囲が大きいため、データを失う危険はありません。

VARCHAR(50)VARCHAR(200)に変更することができます。タイプは互換性があり、サイズが大きくなり、何かを切り捨てる危険はありません。

基本的に、あなただけの

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 

または何を必要としています。 200文字以上の文字列がない限り、大丈夫です。より長い文字列を使用していた場合には何が起こるかわかりません。エラーが発生して変換が失敗するか、先に進んで一部のデータが切り捨てられている可能性があります。あなたはその列の値を持っている場合、明らかに - だから私は、あなたが最初にあなたがINTまたはそのような何かにVARCHARを変更する必要がある場合、それは少しトリッキー取得

:-)あなたのデータのコピーでこれを試してみてください示唆します新しいタイプに「適合」しないと、変換は失敗します。しかし、別の "一時的な"新しい列を使用してもこれを修正することはできません。何らかの形でそれらの "互換性のない"ケースに対処する必要があります(無視してNULLを残し、デフォルト値に設定します)。

また、VARCHARNVARCHARの間の切り替えは、たとえば次のような場合には難しくなります。他の形式では表現できないか、またはあるタイプから別のタイプへの「デフォルト」変換が期待通りに機能しないため、変換時に特定のエントリが失われる可能性があります。

+1

'CHAR'から' VARCHAR 'に対応し、パディングをトリミングします。 –

+0

VARCHARからTEXTへの変更に問題がありますか? – Murilo

+1

@Murilo: 'TEXT'はすでに廃止されていますので、すぐに削除されますので、**データ型' TEXT'に列*を変更するのではなく** VARCHAR(MAX)あなたは本当に8000文字以上のデータを必要とします –

0

タイプvarchar(NN)でtemp2を追加し、update tbl set column2 = columnを実行してエラーが発生していないかどうかを確認します。すべてが問題ない場合は元の列を変更し、データを元に戻してcolumn2を削除します。

1

テーブルのその列の最大データ長を計算します。

Select max(len(fieldname)) from tablename 

これで、前のクエリで得られた結果にその列のサイズを減らすことができます。

ALTER TABLE dbo.YourTable 
ALTER COLUMN YourColumn VARCHAR(200) NULL 
+0

最初のテーブルのSCHEMAを見る場合、この最初のステップは必要ですか? –

+0

あなたはvarcharフィールドを減らしたいので、これが最初のステップになるはずです。 –

+1

私はお詫び申し上げます。私は誤解して、彼が縮小していない、拡大していると思った。 –

関連する問題