如何为所有标识列重新设定种子?

Sha*_*mad 0 sql-server-2008 sql-server sql-server-2008-r2 identity ddl

禁用约束后,我删除了 20 个表中的所有行,使用存储的 proc SP_MsForEachTable 触发。现在在导入之前,我需要重新设置所有标识列以从 1 开始自动编号。

所以我创建了一个存储过程,将表名作为参数传递,因为这似乎需要时间单独执行,是否有另一种方法可以一次对所有表执行此操作?

   CREATE PROCEDURE [dbo].[USP_ReseedID]
@table_name varchar(50)
AS
BEGIN
    DBCC CHECKIDENT ( @table_name, RESEED, 0)

END  
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 7

与其删除然后重新播种,为什么不截断它们呢?这将删除所有行(以比 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;
Run Code Online (Sandbox Code Playgroud)

您可以以类似的方式生成一个类似的脚本,将 RESEED 应用于每个表,但为什么呢?

此外,远离糟糕的存储过程,如sp_MSforeachtable. 由于某种原因,它们没有记录且不受支持。检查以下问题sp_MSforeachdb

(我还没有开始证明它,但我怀疑表的过程 - 具有与数据库相同的游标和整体逻辑 - 可能会以类似的方式中断。)

最后,如果由于外键无法截断,请查看此脚本(#4):