古いデータテーブルから新しいテーブルにデータを移行しています。このプロセスで私はいくつかの問題に遭遇しました。IF内でCREATE/DROPテーブルを使用する方法
私はテーブルを作成し、古いテーブルから新しいものにいくつかのデータをコピーしてから古いテーブルを削除する必要があります。これを達成するには、移行したデータベースで実行してもエラーを表示しないスクリプトを作成する必要があります。つまり、古いテーブルが存在しない場合でも、エラーは表示されず、プロセスをスキップする必要があります。 、ここで
IF NOT EXISTS(SELECT * FROM sys.objects WHERE Object_ID = Object_ID('Old_Table'))
GOTO Migrated_Before
-- Drop OldTable Indexes, PK's and FK's;
-- CREATE newTable ....;
-- Add Indexes, PK's, Fk's;
-- INSERT INTO NewTable(someFields) FROM OldTable.Fields, OtherTable.Fields ...;
-- DROP OldTable;
Migrated_Before:
は問題であるドロップおよび作成する前に、それ以外の場合は次のステージに進み、次のコマンドは、しかし、GOを入れて、失敗する変更をコミットするためにGO必要が:後
は、私が今までに思い付いたものですGOTOとLabelの間でGOTOのラベルが未定義になります。
IFを複数回書き込まずに次のプロセスに進む前に、各プロセスを強制的に実行するにはどうすればよいですか?
解決策:解決策は他の人の参考にしておきます。 次のステートメントに進む前に、必要なすべてのステートメントの前にbeginトランザクションを追加しました。たとえば、create tableまたはdrop FKです。また、gotoとlabelをbegin end(私の最初の解)に置き換えました。
、私はGOTO' 'の使用を再考したいです。結局のところ*有害であるとみなされます* - http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html – Yuck
IFを避ける特別な理由はありますか?私はよく、漸進的な変更がGOとコミット/分離される必要がある冪等でなければならないスキーマ変更スクリプトで作業し、IFはGOTOよりもうまくいくようです。 –
@Yuck、良い点ですが、私は次の行を実行する前にそれぞれの行を実行し、 'begin'、' end'の中で 'GO'が動作しないようにしてください。 – Bistro