有没有办法截断具有外键的表?

Iva*_*anP 3 sql-server-2008 foreign-key sql-server truncate ddl

有没有办法截断具有外键的表?删除和重新设定种子可能需要很长时间。删除和重新创建密钥是唯一的方法吗?如果是这样,是否有工具可以做到这一点?

Aar*_*and 9

不,您要么需要删除并重新创建密钥,要么等待删除并重新播种。暂时禁用外键可能会使删除更快,但它仍然不允许截断。

ALTER TABLE [dbo].[tablename] NOCHECK CONSTRAINT ALL;

-- delete, reseed, etc.

ALTER TABLE [dbo].[tablename] WITH CHECK CHECK CONSTRAINT ALL;
Run Code Online (Sandbox Code Playgroud)

通过从元数据表构建动态 SQL 非常容易实现自动化,具体取决于您需要定位的表。以上只是一个示例,用于演示如何对单个表进行操作。例如,这将对作为外键目标并具有一IDENTITY列的每个表执行此操作:

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'SET NOCOUNT ON;';

;WITH s(t) AS
 (
   SELECT 
     QUOTENAME(OBJECT_SCHEMA_NAME(referenced_object_id)) 
     + '.' + QUOTENAME(OBJECT_NAME(referenced_object_id))
  FROM sys.foreign_keys AS k
  WHERE EXISTS 
  (
    SELECT 1 FROM sys.identity_columns 
    WHERE [object_id] = k.referenced_object_id
  )
  GROUP BY referenced_object_id
)
SELECT @sql = @sql + N'
  ALTER TABLE ' + t + ' NOCHECK CONSTRAINT ALL;
  DELETE ' + t + ';
  DBCC CHECKIDENT(''' + t + ''', RESEED, 0) WITH NO_INFOMSGS;
  ALTER TABLE ' + t + 'WITH CHECK CHECK CONSTRAINT ALL;'
FROM s;

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

可能是输出被截断了,但这只是PRINT(8K)的限制- 实际命令已完成。

PS 这假定 SQL Server 2005 或更好。将您的版本指定为问题的一部分总是有用的(通常带有标签)。