在我們項目開發過程中,經常遇到需要在開發數據庫基礎上清理一個空庫,
但由於對數據庫結構缺乏整體瞭解,在刪除一個表的記錄時,刪除不了,
因爲可能有外鍵約束,一個常見的數據庫結構是一個主表,一個子表,
這種情況下一般都得先刪除子表記錄,再刪除主表記錄。
說到刪除數據記錄,往往馬上會想到的是delete和truncate語句,
但在遇到在兩個或多個表之間存在約束的話,這兩個語句可能都會失效,
而且最要命的是這兩個命令都只能一次操作一個表。
如果手動一個個的去刪除表實在太麻煩了。偷懶的思路如下:
禁用所有約束,刪除所有數據,最後再啓用約束,這樣就不用花時間和精力
去研究什麼約束了,只需要編寫一個簡單的存儲過程就可以自動完成這個任務。
Procedure代碼如下:
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
你可以在任何數據庫上運行這個存儲過程,當然不要在生成數據庫上運行,
可別怪我沒告訴你!不管怎樣,還是先備份一下數據庫,使用備份數據庫還原,