Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL Server截断表-删除并重新创建FK约束脚本_C#_Sql Server_Ado.net - Fatal编程技术网

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

C# SQL Server截断表-删除并重新创建FK约束脚本,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我正在用c编写一个小应用程序,它可以帮助我在SQLServer2005/08中截断表。为了截断表,我想我需要这样做: 从表中删除所有FK约束, 截断表格, 重新创建以前删除的所有约束。 有人能帮我创作这样一个剧本吗,或者告诉我在哪里可以找到一些线索 关于企业管理者: 选择表格, 右键单击表格,选择所有任务->生成SQL脚本, 取消勾选生成拖放并生成创建, 单击“选项”选项卡, 勾选表脚本选项下的所有项目 单击返回到“常规”选项卡, 单击预览, 将内容复制到记事本, 现在,您拥有了所有用于重新创建

我正在用c编写一个小应用程序,它可以帮助我在SQLServer2005/08中截断表。为了截断表,我想我需要这样做:

从表中删除所有FK约束, 截断表格, 重新创建以前删除的所有约束。 有人能帮我创作这样一个剧本吗,或者告诉我在哪里可以找到一些线索

关于企业管理者:

选择表格, 右键单击表格,选择所有任务->生成SQL脚本, 取消勾选生成拖放并生成创建, 单击“选项”选项卡, 勾选表脚本选项下的所有项目 单击返回到“常规”选项卡, 单击预览, 将内容复制到记事本, 现在,您拥有了所有用于重新创建索引/键/约束的脚本。 对这段脚本稍加修改,就可以生成drop约束和drop索引语句。最后删除任何聚集索引,否则您将继续重建其他索引

执行拖放,截断表,然后执行脚本编写的创建


另外:在完成此操作后立即执行数据库备份,因为任何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。