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命令批处理执行。

限制:现在,只有拥有单列外键时,脚本才会假定并起作用; 如果你没有,你可能需要稍微调整一下脚本。

在企业管理器中:

  1. 选择表格,
  2. 右键单击该表,选择All Tasks – > Generate SQL Scripts,
  3. 取消勾选生成Drop生成Create
  4. 单击“选项”选项卡,
  5. 勾选表脚本选项下的所有项目
  6. 单击返回“常规”选项卡,
  7. 单击预览,
  8. 将内容复制到记事本,
  9. 您现在拥有了用于重新创建索引/键/约束的所有脚本。

通过对这一块脚本进行一些按摩,您可以制作drop constraintdrop index语句。 最后删除任何聚簇索引,否则您将在重建时重建其他索引。

执行您的drop,截断表,然后执行您编写的创建。

另外:在完成此操作后立即执行数据库备份,因为任何truncate table语句都会将事务日志置于不确定状态,因为不会记录truncate table语句。