天天看點

清空SQL Server資料庫中所有表資料的方法(轉)

清空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

從這兩個選擇中不難看出第二個選擇是最簡單有效的了,那麼在使用第二個選擇時,具體該怎麼實施呢?