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

一鍵清空全庫資料並重置識別欄:三種 T-SQL 方案對比

     編輯:關於SqlServer

資料庫膨脹、空間不足,需清空所有資料表並讓識別欄(IDENTITY)從 1 重新計數。手動逐張 TRUNCATE 太慢,以下提供三種批次處理方案,適用於 MS SQL Server。

方案一:動態 SQL 字串拼接(適合中小型資料庫)

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 記錄失敗表名,確保可追蹤、可重跑。

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