20

間違って宣言されたと思われるコラムがあります。データが含まれており、データを失いたくありません。

定義を varchar(max) から varchar(integer) に変更したいと考えています。列のタイプを変更することはできないという印象を受けましたか?

一時列「column2」を作成し、問題のあるタイプの列からこの列にデータを転送し、問題のある列を削除してから、一時列の名前を元の問題のある列に変更する最良の方法はありますか?

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

編集:同じ問題を抱えている人は、ALTERステートメントを使用できます。

4

4 に答える 4

29

データ型がある程度「関連」している限り、そうです、絶対にこれを行うことができます。

INTをaに変更できますBIGINT。2番目のタイプの値の範囲が大きいため、データが「失われる」危険はありません。

VARCHAR(50)aを-に変更できますVARCHAR(200)。タイプは互換性があり、サイズは大きくなっています-何かを切り捨てるリスクはありません。

基本的に、あなたはただ必要です

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

または何でも。200文字より長い文字列がない限り、問題はありません。文字列が長い場合はどうなるかわかりません。変換がエラーで失敗するか、先に進んで一部のデータが切り捨てられた可能性があることを通知します。したがって、最初にデータのコピーでこれを試すことをお勧めします:-)

VARCHARをまたはそのようなものに変更する必要がある場合は、少し注意が必要です。INT明らかに、新しいタイプに「適合」しない列値がある場合、変換は失敗します。ただし、別の「一時的な」新しい列を使用しても、これは修正されません。これらの「互換性のない」ケースに何らかの方法で対処する必要があります(無視し、NULLを残し、デフォルト値に設定します)。

VARCHARまた、西ヨーロッパ以外の文字を使用している場合は、とを切り替えるのNVARCHARが難しい場合があります。他の形式で表現できないため、またはあるタイプから別のタイプへの「デフォルト」変換であるため、変換時に特定のエントリが失われる可能性があります。期待どおりに機能しません。

于 2012-05-18T09:46:49.913 に答える
3

そのテーブルのその列に格納される最大データ長を計算します。

Select max(len(fieldname)) from tablename

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

ALTER TABLE dbo.YourTable
ALTER COLUMN YourColumn VARCHAR(200) NULL
于 2012-05-18T09:55:52.080 に答える
0

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

于 2012-05-18T09:48:33.973 に答える