我正在编写小应用程序(在c#中),这有助于我截断SQL Server 2005/08中的表。为了截断表格,我认为我需要这样做:
有人可以帮助我创建这样的脚本,还是指出我可以在哪里找到一些线索?
此致
答案 0 :(得分:4)
嗯,你可以从你的申请中做到这一点:
您可以通过检查系统目录视图来执行此操作。
此查询将为您提供所有外键约束的列表:
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
对于这两个查询,这是一个两步过程:
限制:现在,只有拥有单列外键时,脚本才会假定并且有效;如果你没有,你可能需要稍微调整一下脚本。
答案 1 :(得分:0)
在企业管理器中:
通过对这一块脚本进行一些按摩,您可以制作drop constraint
和drop index
语句。最后删除任何聚簇索引,否则你将在重建时重建其他索引。
执行你的drop,截断表,然后执行你编写的创建。
此外:在完成此操作后立即执行数据库备份,因为任何truncate table
语句都会将事务日志置于不确定状态,因为truncate table
语句未被记录。