SQL Server截断表 – 删除并重新创建FK约束脚本
我正在编写小应用程序(在c#中),这有助于我在SQL Server 2005/08中截断表。 为了截断表我想我需要这样做:
- 从表中删除所有FK约束,
- 截断表格,
- 重新创建所有以前删除的约束。
有人可以帮我创建这样的脚本,还是指点我可以找到一些线索?
问候
那么,你可以从你的应用程序中执行此操作:
- 在现有数据库上运行SQL命令以查找所有外键约束
- 从该外键约束列表中,创建两个脚本
- 一个删除所有现有的外键约束(在截断表之前)
- 第二个在截断表后重新创建外键约束
您可以通过检查系统目录视图来执行此操作。
此查询将为您提供所有外键约束的列表:
select fk.name, object_name(fk.parent_object_id) 'Parent table', c1.name 'Parent column', object_name(fk.referenced_object_id) 'Referenced table', c2.name 'Referenced column' from sys.foreign_keys fk inner join sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id inner join sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id inner join sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id
通过组合这些元素,您可以创建在截断表之前运行的DROP CONSTRAINT
命令列表:
select 'ALTER TABLE dbo.' + object_name(fk.parent_object_id) + ' DROP CONSTRAINT ' + fk.name from sys.foreign_keys fk
您还可以创建在截断后运行的ALTER TABLE
脚本以恢复外键关系。
select 'ALTER TABLE dbo.' + object_name(fk.parent_object_id) + ' ADD CONSTRAINT ' + fk.name + ' FOREIGN KEY(' + c1.name + ') REFERENCES dbo.' + object_name(fk.referenced_object_id) + '(' + c2.name + ')' from sys.foreign_keys fk inner join sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id inner join sys.columns c1 ON fkc.parent_column_id = c1.column_id and c1.object_id = fkc.parent_object_id inner join sys.columns c2 ON fkc.referenced_column_id = c2.column_id and c2.object_id = fkc.referenced_object_id
对于这两个查询,这是一个两步过程:
- 首先执行我使用C#和ADO.NET针对您的数据库显示的查询
- 这将产生一个输出,它是一个T-SQL命令列表(DROP或重新创建FK关系)
- 获取输出,然后在第二步中,从C#/ ADO.NET应用程序中将该输出作为T-SQL命令批处理执行。
限制:现在,只有拥有单列外键时,脚本才会假定并起作用; 如果你没有,你可能需要稍微调整一下脚本。
在企业管理器中:
- 选择表格,
- 右键单击该表,选择All Tasks – > Generate SQL Scripts,
- 取消勾选生成Drop并生成Create ,
- 单击“选项”选项卡,
- 勾选表脚本选项下的所有项目
- 单击返回“常规”选项卡,
- 单击预览,
- 将内容复制到记事本,
- 您现在拥有了用于重新创建索引/键/约束的所有脚本。
通过对这一块脚本进行一些按摩,您可以制作drop constraint
和drop index
语句。 最后删除任何聚簇索引,否则您将在重建时重建其他索引。
执行您的drop,截断表,然后执行您编写的创建。
另外:在完成此操作后立即执行数据库备份,因为任何truncate table
语句都会将事务日志置于不确定状态,因为不会记录truncate table
语句。