Sql Serverでは、すべてのデータテーブルのレコードをクリアします。


Sql Serverでは、すべてのデータテーブルのレコードをクリアします。
すべてのデータテーブルのレコードを空にします。
exec sp_msforeachtable  @Command1 ='truncate table ?'
すべてのデータテーブルを削除:
exec sp_msforeachtable 'delete   N''?'''
SQL Serverデータベース内の表データをすべてクリアする方法(制約がある場合)
実は、データベースからデータを削除する方法は複雑ではないです。なぜ私は余計なことをしたのですか?一つは、ここで紹介したのはデータベースを削除するすべてのデータです。データの間に相互制約関係ができ、削除操作はデッドサイクルに陥るかもしれません。もう一つはここでマイクロソフトが正式に公開していないsp_を使っています。MSForEachTable格納プロセス。
多くの読者の友達がこのようなことを経験したかもしれません。データベースを開発した上で、空きライブラリを整理します。しかし、データベースの構造に対して全体的な理解が足りないため、一つのテーブルの記録を削除する時、削除できません。外部キーの制約があるかもしれません。一つのよくあるデータベース構造はメインテーブルで、一つのサブテーブルの記録を削除します。メインテーブルレコードを削除します。
データレコードを削除すると、すぐにdeleteとtruncate文が思いつきますが、二つ以上の表の間に制約があると、この二つの文は失効する可能性があります。そして、一番ひどいのはこの二つの命令は一つの表を一回だけ操作することです。SQL Serverデータベースからすべてのレコードを削除するとき、本当に会ったらどうすればいいですか?二つの選択があります
1.先着順に逐次削除します。この方法は表が非常に多い場合は非現実的に見えます。たとえ表の数が多くなくても、制約が多い場合は、その間の制約関係を研究する時間と精力を費やして、どの表を削除してどの表を削除しますか?最後にどの表を削除しますか?
2.すべての制約を無効にし、すべてのデータを削除し、最後に制約を有効にします。このように、時間と精力をかけて何かの制約を研究しなくてもいいです。簡単な記憶プロセスを作成するだけで、自動的にこのタスクを完成できます。

CREATE PROCEDURE sp_DeleteAllData
AS
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL'
EXEC sp_MSForEachTable 'DELETE FROM ?'
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL'
EXEC sp_MSFOREACHTABLE 'SELECT * FROM ?'
GO
この二つの選択の中から、二つ目の選択は一番簡単で効果的です。二つ目の選択を使う時、具体的にはどうすればいいですか?
まずコードループを作成してすべてのテーブルをチェックします。ここではメモリのsp_を紹介します。MSForEachTableは、マイクロソフトの公式文書ではこの保存過程について説明していないので、多くの開発者はまだ聞いていないかもしれません。だから、インターネットで検索した解決方法は多くて複雑です。公式文書がない以上、この保存過程は不安定になり、心理的に排斥されるかもしれません。まず完全なスクリプトを見ます。
このスクリプトはsp_という名前のスクリプトを作成しました。DeleteAllDataの記憶プロセスは、前の2行の文はそれぞれ制約とトリガーを無効にし、第3条の文は本当にすべてのデータを削除し、次の文はそれぞれ制約とトリガーを復元し、最後の文は各表の記録を表示します。もちろん、この文は不要です。すべての表が空になっているかどうか確認したいだけです。
このストレージプロセスは任意のデータベースで実行できます。もちろん生成データベースで実行しないでください。いずれにしても、まずデータベースをバックアップして、バックアップデータベースを使って元に戻してから、このストレージプロセスを実行します。ほほほ、たとえ大規模なデータベースであっても、そんなに時間がないと、あなたのデータベースは空の倉庫になります。TRUNCATE TABLE文は速くて、ログなしの方法です。TRUNCATE TABLEはWHERE子文を含まないDELETE文と機能的に同じです。しかし、TRUNCATE TABLEはより速く、より少ないシステムリソースと事務ログリソースを使用しています。DELETE文に比べ、TRUNCATE TABLEは以下の利点があります。DELETE文は1行ずつ削除し、削除した行ごとに1つを事務ログに記録します。TRUNCATE TABLEは、テーブルデータを格納するためのデータページをリリースすることによりデータを削除し、トランザクションログにはページのみを記録してリリースする。使用するロックは通常より少ないです。行ロックを使ってDELETE文を実行すると、表の各行をロックして削除します。TRUNCATE TABLEは常に表とページをロックします。例外がなければ、表には何のページも残っていません。DELETE文を実行すると、テーブルには空のページが含まれます。例えば、少なくとも一つの列を使用しなければなりません。同前X)時計のロックは、山の中の空の時計を解放することができます。削除操作を行う場合は、テーブルロックが使用されていません。テーブル(ヒープ)には多くの空ページが含まれています。インデックスに対しては、削除操作はいくつかの空白ページを残しますが、これらのページはバックグラウンドクリアプロセスによって迅速にリリースされます。DELETE文と同じで、TRUNCATE TABLEでクリアされたテーブルの定義は、インデックスや他の関連オブジェクトと一緒にデータベースに保存されます。