直接使用 DELETE 或 TRUNCATE 清空資料表時,外鍵約束會阻擋操作,且這兩指令一次只能處理單一資料表。手動排序刪除順序在表多、約束複雜時極不現實。
利用微軟未公開但廣泛使用的 sp_MSForEachTable 系統存儲過程,批次對所有資料表執行操作。
CREATE PROCEDURE sp_DeleteAllData
AS
BEGIN
-- 1. 禁用所有約束
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL';
-- 2. 禁用所有觸發器
EXEC sp_MSForEachTable 'ALTER TABLE ? DISABLE TRIGGER ALL';
-- 3. 刪除所有資料
EXEC sp_MSForEachTable 'DELETE FROM ?';
-- 4. 重新啟用約束
EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL';
-- 5. 重新啟用觸發器
EXEC sp_MSForEachTable 'ALTER TABLE ? ENABLE TRIGGER ALL';
-- 6. 驗證清空結果 (可選)
EXEC sp_MSForEachTable 'SELECT * FROM ?';
END
GO
sp_MSForEachTable 雖無官方文件,但在 SQL Server 2000 至 2019 皆穩定可用。sp_MSForEachTable 內部遍歷 sysobjects 類型為 'U' 的使用者資料表,將 ? 替換為資料表名稱執行動態 SQL。此法繞過外鍵檢查,一次性清空全庫。
TRUNCATE 配合拓撲排序(需自行處理相依順序)。