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 ?';
缺點:
-- 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 不可回滾 (隱含提交),執行前務必確認備份可用、確認無進行中交易、已通知相關人員。