Iva*_*anP 3 sql-server-2008 foreign-key sql-server truncate ddl
有没有办法截断具有外键的表?删除和重新设定种子可能需要很长时间。删除和重新创建密钥是唯一的方法吗?如果是这样,是否有工具可以做到这一点?
不,您要么需要删除并重新创建密钥,要么等待删除并重新播种。暂时禁用外键可能会使删除更快,但它仍然不允许截断。
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 或更好。将您的版本指定为问题的一部分总是有用的(通常带有标签)。
| 归档时间: |
|
| 查看次数: |
18825 次 |
| 最近记录: |