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

标签 c# sql-server ado.net

我正在编写一个小型应用程序(用 C# 编写),它可以帮助我截断 SQL Server 2005/08 中的表。为了截断表,我认为我需要这样做:

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

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

问候

最佳答案

那么,您可以从您的应用程序中执行此操作:

  • 在现有数据库上运行 SQL 命令以查找所有外键约束
  • 从外键约束列表中创建两个脚本
    • 删除所有现有外键约束(在截断表之前)
    • 第二个用于在截断表后重新创建外键约束

您可以通过检查系统目录 View 来完成此操作。

这里的查询将为您提供所有外键约束的列表:

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 命令列表的输出(用于删除或重新创建 FK 关系)
  • 获取输出,然后在第二步中从 C#/ADO.NET 应用程序中以 T-SQL 命令批处理的形式执行该输出。

限制:现在,该脚本假定只有在您具有单列外键时才有效;如果没有,您可能需要稍微调整脚本。

关于c# - SQL Server 截断表 - 删除并重新创建 FK 约束脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3892345/

相关文章:

sql - 查询超时

c# - 从 XMLDocument 中的 xml 文件读取节点

c# - 自定义 Log4Net 过滤器级别不写入日志

sql - 如何在SQL中选择没有时间的日期

sql-server - 在更改之前通过 ADO 读取 Excel 文件中的值

.net - 如何为 .net 项目创建 .exe 文件以及如何使用它?

c# - 使用 LINQ 读取 XML 节点

c# - 使用两个扩展名保存文件

sql-server - 分离批量运行的多个SQL Server语句

c# - ADO.NET 从 datagrid1 中选择一行以显示 datagrid2 中的行