Sql-Server

如何重新設定所有身份列?

  • May 7, 2020

在禁用約束後,我從 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

(我還沒有開始證明這一點,但我懷疑表的過程 - 與數據庫具有相同的游標和整體邏輯 - 可能會以類似的方式中斷。)

最後,如果由於外鍵而無法截斷,請查看此腳本(#4):

引用自:https://dba.stackexchange.com/questions/76261