在所有空表中重新设定身份列

Jac*_*ack 7 sql-server identity

我需要编写一个查询来重置所有具有标识列且为空的表的标识。

Aar*_*and 11

由于您可以通过发出简单的 TRUNCATE 来重置 IDENTITY:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'TRUNCATE TABLE ' + QUOTENAME(s.name) + N'.'
  + QUOTENAME(t.name) + N';' + CHAR(13) + CHAR(10)
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.identity_columns AS ic
ON t.[object_id] = ic.[object_id]
INNER JOIN sys.partitions AS p
ON p.[object_id] = t.[object_id]
WHERE p.[rows] = 0 -- only empty tables
AND p.index_id IN (0,1)
AND p.partition_number = 1;

PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

虽然这仅适用于未被外键引用的表。如果您有引用这些表的外键(可能),那么您需要:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'DBCC CHECKIDENT(N''' + QUOTENAME(s.name) + N'.'
  + QUOTENAME(t.name) + N''', RESEED);' + CHAR(13) + CHAR(10)
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id]
INNER JOIN sys.identity_columns AS ic
ON t.[object_id] = ic.[object_id]
INNER JOIN sys.partitions AS p
ON p.[object_id] = t.[object_id]
WHERE p.[rows] = 0 -- only empty tables
AND p.index_id IN (0,1)
AND p.partition_number = 1;

PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)


Thr*_*onk 3

您可以编写一个脚本来对该查询生成的表调用 DBCC CHECKIDENT ([TABLENAME], RESEED, 0)(这将通知所有具有标识字段的表。

SELECT         
               t.TABLE_NAME
              ,c.COLUMN_NAME
              ,c.TABLE_CATALOG
              ,c.TABLE_SCHEMA 
FROM         
              INFORMATION_SCHEMA.COLUMNS AS c JOIN
              INFORMATION_SCHEMA.TABLES AS t
                      ON t.TABLE_NAME = c.TABLE_NAME
WHERE         
               COLUMNPROPERTY(OBJECT_ID(c.TABLE_NAME)
                      ,c.COLUMN_NAME,'IsIdentity') = 1 AND
               t.TABLE_TYPE = 'Base Table' AND
               t.TABLE_NAME NOT LIKE 'dt%' AND
               t.TABLE_NAME NOT LIKE 'MS%' AND
               t.TABLE_NAME NOT LIKE 'syncobj_%' 
Run Code Online (Sandbox Code Playgroud)

感谢http://weblogs.sqlteam.com/joew/archive/2008/06/27/60641.aspx