首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 批量清空資料庫所有表資料的高效腳本

     編輯:關於SqlServer

在專案交付給客戶前,往往需要將測試環境的資料庫清空,以提供一個乾淨的初始狀態。若資料表數量龐大,逐一手動 TRUNCATE 或 DELETE 不僅耗時,極易因外鍵約束導致錯誤或遺漏。本文提供一套成熟的 T-SQL 腳本,能自動處理所有使用者資料表的外鍵關聯、級聯刪除規則暫時調整、資料清除與種子重置,最後還原原始約束,實現一鍵式安全清空。

核心邏輯三階段

第一階段:將所有外鍵的刪除規則暫設為 CASCADE

腳本首先掃描 sys.foreign_keys 與 sys.foreign_key_columns,建立完整的關聯關係表變數 @AllRelationships。接著以游標遍歷每張表(排除 sysdiagrams 等系統表),對該表擁有的每個外鍵執行 DROP CONSTRAINT 再 ADD CONSTRAINT ... ON DELETE CASCADE,並以交易包裹確保原子性。若某外鍵無法改為 CASCADE(如參考欄位不允許 NULL),會記錄錯誤並回滾該筆變更,不中斷整體流程。

第二階段:逐表刪除資料並重置識別欄種子

再次以游標遍歷所有使用者資料表,對每張表執行 DELETE FROM [schema].[table];緊接著呼叫 DBCC CHECKIDENT (['table'], RESEED, 0) 將身分識別欄歸零。同樣採用 TRY...CATCH 捕獲錯誤(如仍有外鍵阻擋),輸出錯誤碼與訊息供事後排查。

第三階段:將外鍵刪除規則還原為原始設定

根據先前記錄的 DeleteRule(NO_ACTION、CASCADE、SET_NULL、SET_DEFAULT),再次以游標逐表、逐外鍵執行 DROP/ADD CONSTRAINT 還原,確保資料庫結構與業務邏輯完全一致。

關鍵細節與最佳實踐

  • 忽略清單機制:@IgnoreTables 表變數預設排除 sysdiagrams,可自行擴充需保留資料的表名。
  • 列印進度:每階段皆輸出 PRINT 訊息,便於在 SSMS「訊息」頁籤即時監控執行狀態。
  • 交易保護:每個外鍵變更、資料刪除皆獨立交易,局部失敗不影響整體。
  • 適用版本:SQL Server 2005 及以上版本皆可直接執行。

使用建議

  1. 在非生產環境先行測試,確認無誤後再套用正式庫。
  2. 執行前務必備份資料庫,雖腳本可還原結構,但資料一旦刪除無法自動復原。
  3. 大型資料庫(>100 GB)執行時間可能較長,建議在維護視窗執行並監控交易記錄空間。

此腳本已於多個專案交付場景驗證,能大幅降低人工操作風險,歡迎依實際需求調整忽略清單與錯誤處理邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved