資料庫膨脹、空間不足,需清空所有資料表並讓識別欄(IDENTITY)從 1 重新計數。手動逐張 TRUNCATE 太慢,以下提供三種批次處理方案,適用於 MS SQL Server。
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql += N'TRUNCATE TABLE ' + QUOTENAME(name) + N'; '
FROM sys.objects
WHERE type = 'U' AND is_ms_shipped = 0;
EXEC sp_executesql @sql;
⚠ 缺點: 字串長度受限(NVARCHAR(MAX) 理論 2GB,但實際執行計畫可能截斷),表數超過數百張時風險極高。
DECLARE @tbl SYSNAME;
DECLARE cur CURSOR LOCAL FAST_FORWARD FOR
SELECT QUOTENAME(name) FROM sys.objects WHERE type = 'U' AND is_ms_shipped = 0;
OPEN cur;
FETCH NEXT FROM cur INTO @tbl;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC (N'TRUNCATE TABLE ' + @tbl + N';');
PRINT N'Truncated: ' + @tbl;
FETCH NEXT FROM cur INTO @tbl;
END
CLOSE cur; DEALLOCATE cur;
✅ 優點: 無長度限制、可加入條件篩選(如只清特定 Schema)、易封裝為 sp_CleanAllTables 定期排程。
sp_MSforeachtable(最短代碼,慎用於生產)EXEC sp_MSforeachtable 'TRUNCATE TABLE ?';
⚠ 風險: 非文件化功能,版本升級可能移除或行為變更,且無法精細控制順序與錯誤處理。
TRUNCATE TABLE 會自動重置識別欄種子。若改用 DELETE,需額外執行:
DBCC CHECKIDENT ('TableName', RESEED, 0);
建議: 生產環境首選方案二,搭配 TRY...CATCH 記錄失敗表名,確保可追蹤、可重跑。