萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> 資料庫綜合

MSSQL 一鍵清空資料庫所有資料表資料:游標批次 TRUNCATE 與 sp_MSforeachtable

方案一:游標逐表 TRUNCATE (可控性高、可排除特定表)

DECLARE @TableName SYSNAME, @Sql NVARCHAR(MAX);
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
    SELECT QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name)
    FROM sys.tables
    WHERE type = 'U'
      AND name NOT IN ('ExcludeTable1', 'ExcludeTable2');  -- 排除不想清空的表

OPEN cur;
FETCH NEXT FROM cur INTO @TableName;
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @Sql = N'TRUNCATE TABLE ' + @TableName + ';';
    PRINT @Sql;  -- 確認後移除 PRINT 改 EXEC
    -- EXEC sp_executesql @Sql;
    FETCH NEXT FROM cur INTO @TableName;
END;
CLOSE cur; DEALLOCATE cur;

優點: 可精確控制排除清單、順序處理外鍵相依 (先刪子表)、印出腳本供審核。

方案二:無識別系欄位表 → 系統預存程序 sp_MSforeachtable (最簡潔)

EXEC sp_MSforeachtable 'TRUNCATE TABLE ?';

缺點:

  • 無法指定執行順序,外鍵相依會報錯 (需先停用 FK 或手動排序)。
  • 不可排除特定表。
  • 未文件化、未來版本可能移除。

方案三:有外鍵相依時的正確順序 (拓撲排序)

-- 1. 停用所有 FK
EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';

-- 2. 執行 TRUNCATE (順序無關)
EXEC sp_MSforeachtable 'TRUNCATE TABLE ?';

-- 3. 重新啟用 FK
EXEC sp_MSforeachtable 'ALTER TABLE ? CHECK CONSTRAINT ALL';

⚠ 停用 FK 期間資料完整性無保障,僅限維護窗口、無並發寫入環境使用。

方案四:重建資料庫 (最徹底、需停機)

-- 單一資料庫重建
ALTER DATABASE TargetDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
DROP DATABASE TargetDB;
CREATE DATABASE TargetDB;  -- 依原設定重建

選擇建議

場景推薦方案
開發/測試環境、無外鍵、全清方案二 sp_MSforeachtable
正式環境維護窗口、有外鍵、需排除表方案一 游標 + 手動順序/排除
大量資料、可接受短暫停機、要最快方案四 重建資料庫
自動化部署腳本方案一 產出腳本檔存入版控

警示

TRUNCATE 不可回滾 (隱含提交),執行前務必確認備份可用、確認無進行中交易、已通知相關人員。

copyright © 萬盛學電腦網 all rights reserved