我正在编写一个小型应用程序(用 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/