清空擁有外鍵約束的資料庫所有資料表,逐表刪除極易陷入「先刪子表再刪父表」的依賴地獄。利用微軟未公開的 sp_MSForEachTable 系統預存程序,可一次禁用所有約束、清空資料、再恢復約束。
CHECK CONSTRAINT。TRIGGER。DELETE FROM 清空資料。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 COUNT(*) AS Rows FROM ?';
END
GO
EXEC sp_DeleteAllData;
sp_MSForEachTable 會遍歷目前資料庫所有使用者資料表,將 ? 替換為表名執行動態 SQL。NOCHECK CONSTRAINT 僅暫停驗證,不移除定義;CHECK CONSTRAINT 恢復驗證。IDENTITY 種子(需 DBCC CHECKIDENT 或 TRUNCATE)。DELETE 會產生大量記錄檔,考慮分批或使用 TRUNCATE(需先移除 FK)。