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)
与其删除然后重新播种,为什么不截断它们呢?这将删除所有行(以比 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
:
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):
归档时间: |
|
查看次数: |
1474 次 |
最近记录: |