Sql-Server
如何重新設定所有身份列?
在禁用約束後,我從 20 個表中刪除了所有行,使用儲存的 proc SP_MsForEachTable 觸發器。現在在導入發生之前,我需要重新設置所有標識列以從 1 開始自動編號。
所以我創建了一個儲存過程,將表名作為參數傳遞,因為它似乎需要時間單獨執行,是否有另一種方法可以同時為所有表執行此操作?
CREATE PROCEDURE [dbo].[USP_ReseedID] @table_name varchar(50) AS BEGIN DBCC CHECKIDENT ( @table_name, RESEED, 0) END
為什麼不直接截斷它們,而不是刪除然後重新播種?這將刪除所有行(以比 DELETE 稍微更有效的方式)並重新設定 IDENTITY 列的種子。
DECLARE @sql NVARCHAR(MAX) = N''; SELECT @sql += N' TRUNCATE TABLE ' + QUOTENAME(s.name) + '.' + QUOTENAME(t.name) + ';' FROM sys.tables AS t INNER JOIN sys.schemas AS s ON t.[schema_id] = s.[schema_id] WHERE EXISTS -- leave this out if you want to truncate ALL tables ( SELECT 1 FROM sys.identity_columns WHERE [object_id] = t.[object_id] ); PRINT @sql; -- EXEC sp_executesql @sql;
您可以以類似的方式生成一個類似的腳本,將 RESEED 應用於每個表,但為什麼呢?
此外,請遠離糟糕的儲存過程,例如
sp_MSforeachtable
. 由於某種原因,它們沒有記錄且不受支持。檢查以下問題sp_MSforeachdb
:
- http://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/
- https://sqlblog.org/2010/12/29/a-more-reliable-and-more-flexible-sp_msforeachdb
(我還沒有開始證明這一點,但我懷疑表的過程 - 與數據庫具有相同的游標和整體邏輯 - 可能會以類似的方式中斷。)
最後,如果由於外鍵而無法截斷,請查看此腳本(#4):