如何删除SQL Server表列表,忽略约束?

Joa*_*rel 14 sql sql-server sql-server-2008 sql-drop

我有一个包含6个MSSQL 2008表的列表,我想从我的数据库中一次删除.数据已完全迁移到新表.表中没有引用表.

问题是旧表带有大量内部FK约束,这些约束已由工具自动生成(实际上是aspnet_regsql).因此,手动删除所有约束是一个真正的痛苦.

如何忽略所有内部约束而丢弃旧表?

小智 6

这取决于你想如何删除表.如果表的列表需要覆盖几乎超过数据库下表的20%.

然后我将在我的脚本下禁用该DB中的所有约束,并删除表并在同一脚本下启用约束.

--To Disable a Constraint at DB level

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'

--Write the code to DROP tables

DROP TABLE TABLENAME

DROP TABLE TABLENAME

DROP TABLE TABLENAME

--To Enable a Constraint at DB level

EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
Run Code Online (Sandbox Code Playgroud)

最后检查你的约束的状态启动这个查询.

--Checks the Status of Constraints

SELECT (CASE 
    WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED'
    ELSE 'DISABLED'
    END) AS STATUS,
    OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME,
    OBJECT_NAME(FKEYID) AS TABLE_NAME,
    COL_NAME(FKEYID, FKEY) AS COLUMN_NAME,
    OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME,
    COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME
FROM SYSFOREIGNKEYS
ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO
Run Code Online (Sandbox Code Playgroud)

如果您不想在数据库级别禁用约束,请创建要删除的表的列表.

第1步:检查与thos表关联的约束

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')
Run Code Online (Sandbox Code Playgroud)

步骤2:禁用与这些表关联的约束.

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
Run Code Online (Sandbox Code Playgroud)

第3步:删除表格

DROP TABLE TABLENAME
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 5

简单的DROP TABLE dbo.MyTable将忽略除外键之外的所有约束(和触发器)(除非您首先删除子表/引用表),您可能必须先删除这些约束。

编辑:评论后:

没有自动的方法。您必须迭代sys.foreign_keys并生成一些 ALTER TABLE 语句。