質問

SQL Server で相互に関連するテーブルのグループを削除する簡単な方法はありますか?理想的には、プロセスの終わりまでにグループ全体がいなくなることがわかっているため、ドロップされる順序について心配する必要はありません。

役に立ちましたか?

解決

愚かに聞こえるかもしれないが、SQL Server が削除 / カスケード構文をサポートしているとは思えません。カスケード削除を行うように削除ルールを設定できると思います(http://msdn.microsoft.com/en-us/library/ms152507.aspx)、しかし、私の知る限り、SQL Serverのトリックは、削除するテーブルごとにドロップクエリを1回実行し、それが機能することを確認することです。

他のヒント

別のアプローチとしては次のようなものが考えられます。まず制約を取り除き、次にテーブルを一度に削除します。

つまり、すべての制約に対して DROP CONSTRAINT を使用し、次に各テーブルに対して DROP TABLE を使用します。この時点では、実行順序は問題になりません。

これには、 sp___drop___制約 スクリプトは次の場所にあります データベースジャーナル:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

注記 これは明らかに、データベース内のすべてのテーブルを削除するつもりであるため、注意してください。

これをテストするための SQL Server へのアクセス権はありませんが、次のことはどうでしょうか。

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

デレクのアプローチがうまくいくかどうかはわかりません。まだベストアンサーとしてマークされていません。

そうでない場合:SQL Server 2005 ならそれが可能だと思います。
そこで彼らは例外を導入しました(私はまだ使用していません)。したがって、テーブルを削除し、例外が発生した場合はそれをキャッチし、例外がすべてなくなるまで次のテーブルを試します。
必要に応じて、テーブルのリストを一時テーブルに保存し、カーソルを使用してテーブルを移動できます。

結局Apacheを使うことになった ddlutils 私の場合はドロップを実行することで解決しましたが、SQLサーバー内でのみ機能する解決策はかなり簡単です。

@Derek Park、テーブルをカンマで区切ることができるとは知らなかったので便利ですが、期待どおりに機能しないようです。IF EXISTS も CASCADE も SQL サーバーによって認識されないようで、実行されています drop table X, Y, Z 指定された順序でドロップする必要がある場合にのみ機能するようです。

こちらも参照 http://msdn.microsoft.com/en-us/library/ms173790.aspx, では、ドロップ テーブルの構文について説明します。

テーブルを任意の順序で削除することを妨げているのは、テーブル間の外部キーの依存関係です。だから、始める前にFKを外してください。

  1. INFORMATION_SCHEMA システム ビューを使用して、これらのテーブルのいずれかに関連するすべての外部キーのリストを取得します。
  2. これらの外部キーをそれぞれ削除します
  3. これで、任意の順序ですべてのテーブルを削除できるようになります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top