列幅を変更する


39

列(nvarchar)の幅を増やすと、必然的にテーブルが削除されますか?

言い換えると、アクティブユーザーがいる実稼働環境で幅を変更できますか?

サイズが(減少ではなく)増加している場合、これは問題にならないだろうと考えました。

回答:


52

以下のようなT-SQLステートメントを使用して実行している場合、テーブルのドロップは発生せず、運用環境で安全に実行できます。

alter table <table> alter column <column> nvarchar(biggernumber) [not] null

SSMS Design Table GUIを使用して実行する場合、変更を実装するために使用することを決定したスクリプトに依存します。一時テーブルにデータを挿入し、元のテーブルを削除し、そのテーブルの新しいバージョンを作成して、新しいテーブルに挿入する場合があります。それが何をするかを知る簡単な方法は、「スクリプトの生成」ボタンをクリックして、実行を計画しているT-SQLを調べることです。


1
「スクリプトを生成」ボタンでも、スクリプトを表示する前にテーブルを削除しようとしているという警告がスローされると思いました。
ニックチャマス

1
エラーはスローされますが、スクリプトを含むウィンドウで[OK](または実行など)をクリックするまで、実際にはスクリプトは実行されません。スクリプトをコピーして、スクリプトを表示するウィンドウをキャンセルできます。
-mrdenny

しかし、floatからDecimal(n、n)への変更については機能しますか?
ニシャンスシャーン

テーブルが複製された場合、これはどのような影響がありますか?サブスクライバーテーブルが自動的に更新されないと仮定していますか?
tmwoods

18

列の列幅を広げてもnvarchar、テーブルをドロップする必要はありません。いずれのALTER TABLE操作も行いません。テーブルまたは列のプロパティを変更する際の制限の詳細については、ALTER TABLEステートメントを参照してください

以下のドキュメントから最も関連する部分をコピーしました。

列のサイズを変更する

ALTER COLUMN句で列データ型の新しいサイズを指定することにより、列の長さ、精度、またはスケールを変更できます。列にデータが存在する場合、新しいサイズをデータの最大サイズより小さくすることはできません。また、列がvarchar、nvarchar、またはvarbinaryデータ型であり、インデックスがPRIMARY KEY制約の結果でない限り、カラムをインデックスに定義することはできません。例Pを参照してください。

ロックとALTER TABLE

ALTER TABLEで指定された変更はすぐに実装されます。変更がテーブル内の行の変更を必要とする場合、ALTER TABLEは行を更新します。ALTER TABLEは、テーブルのスキーマ変更ロックを取得して、最後に非常に短いSCH-Mロックを必要とするオンラインインデックス操作を除き、変更中に他の接続がテーブルのメタデータを参照しないようにします。ALTER TABLE…SWITCH操作では、ロックはソーステーブルとターゲットテーブルの両方で取得されます。テーブルに加えられた変更はログに記録され、完全に回復可能です。列の削除やデフォルトのNOT NULL列の追加など、非常に大きなテーブルのすべての行に影響する変更は、完了して多くのログレコードを生成するのに時間がかかる場合があります。これらのALTER TABLEステートメントは、INSERT、UPDATE、


また素晴らしい答え。しかし、私は1つしか選ぶことができませんでした。ありがとう!
フェルナンド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.