删除表中的所有约束

时间:2013-04-03 10:54:28

标签: sql-server-2008 constraints

我正在尝试编写用于删除约束的脚本。

我有以下函数来选择我的DataBase中的Constarints

SELECT  name
    FROM sys.foreign_keys

我已经使用上面的脚本编写了alter scripts

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + 
    ' DROP CONSTRAINT ' + name
FROM sys.foreign_keys

使用上面的查询我该如何执行这些约束?

我可以使用DROP DATABASE DBName。但我只是试图通过删除约束来删除表。

可以不用SP吗?或者我可以采取哪些简单方法?

3 个答案:

答案 0 :(得分:35)

您可以随时复制底部窗格中的输出,将其粘贴到顶部窗格中,然后按F5。或者您可以构建一个直接执行的字符串:

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
    + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
    ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
FROM sys.foreign_keys;

PRINT @sql;
-- EXEC sp_executesql @sql;

(当您对PRINT输出感到满意时,请将其注释掉并取消注释EXEC。请注意,在Management Studio中,打印输出将被截断为8K,但该变量确实包含整个命令。)

此外,我不知道这与您是否使用存储过程有什么关系,或者您为什么要尝试“不使用SP”...这个查询可以作为一个存储过程与否,一切都取决于你打算调用它的频率,程序所在的位置等等。

答案 1 :(得分:19)

这在SQL Server 2008中对我有用:

DECLARE @SQL NVARCHAR(MAX) = N'';

SELECT @SQL += N'
ALTER TABLE ' + OBJECT_NAME(PARENT_OBJECT_ID) + ' DROP CONSTRAINT ' + OBJECT_NAME(OBJECT_ID) + ';' 
FROM SYS.OBJECTS
WHERE TYPE_DESC LIKE '%CONSTRAINT' AND OBJECT_NAME(PARENT_OBJECT_ID) = 'YOUR_TABLE';

PRINT @SQL
--EXECUTE(@SQL)

当然,在准备好运行时取消注释EXECUTE(@SQL)

答案 2 :(得分:2)

正确标记的问题对我不起作用。但这在SQL Server 2017中适用于我:

for indx, shape in enumerate(rectangles):
    print indx,shape