SQL Server截断表 - 删除并重新创建FK约束脚本

时间:2010-10-08 16:10:23

标签: c# sql-server ado.net

我正在编写小应用程序(在c#中),这有助于我截断SQL Server 2005/08中的表。为了截断表格,我认为我需要这样做:

  • 从表中删除所有FK约束,
  • 截断表格,
  • 重新创建以前删除的所有约束。

有人可以帮助我创建这样的脚本,还是指出我可以在哪里找到一些线索?

此致

2 个答案:

答案 0 :(得分:4)

嗯,你可以从你的申请中做到这一点:

  • 在现有数据库上运行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 :(得分:0)

在企业管理器中:

  1. 选择表格
  2. 右键单击表格,选择所有任务 - >生成SQL脚本,
  3. 取消勾选生成投放生成投放
  4. 点击“选项”标签,
  5. 勾选表脚本选项
  6. 下的所有项目
  7. 点击返回“常规”标签
  8. 点击预览,
  9. 将内容复制到记事本
  10. 您现在拥有了重新创建索引/键/约束的所有脚本。
  11. 通过对这一块脚本进行一些按摩,您可以制作drop constraintdrop index语句。最后删除任何聚簇索引,否则你将在重建时重建其他索引。

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

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