清空SQL Server數據庫中全部表數據的方法(轉)

清空SQL Server數據庫中全部表數據的方法

其實刪除數據庫中數據的方法並不複雜,爲何我還要畫蛇添足呢,一是我這裏介紹的是刪除數據庫的全部數據,由於數據之間可能造成相互約束關係,刪除操做可能陷入死循環,二是這裏使用了微軟未正式公開的sp_MSForEachTable存儲過程。數據庫

  也許不少讀者朋友都經歷過這樣的事情:要在開發數據庫基礎上清理一個空庫,但因爲對數據庫結構缺少總體瞭解,在刪除一個表的記錄時,刪除不了,由於可能有外鍵約束,一個常見的數據庫結構是一個主表,一個子表,這種狀況下通常都得先刪除子表記錄,再刪除主表記錄。spa

  說道刪除數據記錄,每每立刻會想到的是delete和truncate語句,但在遇到在兩個或多個表之間存在約束的話,這兩個語句可能都會失 效,並且最要命的是這兩個命令都只能一次操做一個表。那麼真正遇到要刪除SQL Server數據庫中全部記錄時,該怎麼辦呢?有兩個選擇:.net

  1.按照前後順序逐個刪除,這個方法在表很是多的狀況下顯得很不現實,即使是表數量很少,但約束比較多時,你仍是要花費大量的時間和精力去研究其間的約束關係,而後找出先刪哪一個表,再刪哪一個表,最後又刪哪一個表。blog

  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 文檔


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

  首先得編寫代碼循環檢查全部的表,這裏我推薦一個存儲過程sp_MSForEachTable,由於在微軟的官方文檔中沒有對這個存儲過程有描 述,不少開發人員也許都還不曾據說,因此你在互聯網上搜索獲得的解決辦法大多很複雜,也許有的人會認爲,既然沒有官方文檔,這個存儲過程可能會不穩定,打 心理上會排斥它,但事實並不是如此。下面來先看一個完整的腳本:it

  這個腳本建立了一個命名爲sp_DeleteAllData的存儲過程,前面兩行語句分別禁用約束和觸發器,第三條語句纔是真正地刪除全部數 據,接下里的語句分別還原約束和觸發器,最後一條語句是顯示每一個表中的記錄,固然這條語句也能夠不要,我只是想確認一下是否清空了全部表而已。class

  你能夠在任何數據庫上運行這個存儲過程,固然不要在生成數據庫上運行,可別怪我沒告訴你!無論怎樣,仍是先備份一下數據庫,使用備份數據庫還原,而後再運行該存儲過程,呵呵,即便是一個大型數據庫,也要很少長時間,你的數據庫就成一個空庫了基礎

相關文章
相關標籤/搜索