C# SQL Server截断表-删除并重新创建FK约束脚本
我正在用c编写一个小应用程序,它可以帮助我在SQLServer2005/08中截断表。为了截断表,我想我需要这样做: 从表中删除所有FK约束, 截断表格, 重新创建以前删除的所有约束。 有人能帮我创作这样一个剧本吗,或者告诉我在哪里可以找到一些线索 关于企业管理者: 选择表格, 右键单击表格,选择所有任务->生成SQL脚本, 取消勾选生成拖放并生成创建, 单击“选项”选项卡, 勾选表脚本选项下的所有项目 单击返回到“常规”选项卡, 单击预览, 将内容复制到记事本, 现在,您拥有了所有用于重新创建索引/键/约束的脚本。 对这段脚本稍加修改,就可以生成drop约束和drop索引语句。最后删除任何聚集索引,否则您将继续重建其他索引 执行拖放,截断表,然后执行脚本编写的创建C# SQL Server截断表-删除并重新创建FK约束脚本,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我正在用c编写一个小应用程序,它可以帮助我在SQLServer2005/08中截断表。为了截断表,我想我需要这样做: 从表中删除所有FK约束, 截断表格, 重新创建以前删除的所有约束。 有人能帮我创作这样一个剧本吗,或者告诉我在哪里可以找到一些线索 关于企业管理者: 选择表格, 右键单击表格,选择所有任务->生成SQL脚本, 取消勾选生成拖放并生成创建, 单击“选项”选项卡, 勾选表脚本选项下的所有项目 单击返回到“常规”选项卡, 单击预览, 将内容复制到记事本, 现在,您拥有了所有用于重新创建
另外:在完成此操作后立即执行数据库备份,因为任何truncate table语句都会将事务日志置于不确定状态,因为truncate table语句不会被记录。您可以从应用程序中执行此操作: 在现有数据库上运行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显示的查询
这将生成一个输出,该输出是用于删除或重新创建FK关系的T-SQL命令列表
获取输出,在第二步中,从C/ADO.NET应用程序以T-SQL命令批处理的形式执行该输出。
限制:现在,脚本假定只有在您有单列外键时才起作用;如果没有,可能需要稍微调整脚本 相关表格中的数据如何?你没事吧?没问题,我会处理的。你有进入管理工作室的权限吗?或者您必须编写自己的脚本吗?我需要编写自己的脚本,而不需要management studio,因为我正在编写一个程序,该程序可以帮助我截断c中的表。感谢您的帮助,但我希望在没有management studio和独立sql脚本的情况下完成此操作,无论是否支持c。