在表中删除所有约束条件

29

我正在尝试编写脚本以删除约束。

我有以下函数来选择我数据库中的约束。

SELECT  name
    FROM sys.foreign_keys

我已经使用上述脚本编写了修改脚本

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + 
    ' DROP CONSTRAINT ' + name
FROM sys.foreign_keys
使用上述查询,我该如何执行这些限制条件?
我可以使用DROP DATABASE DBName。但我只是想通过删除约束来删除表。
是否有可能不使用SP?或者有什么简单的方法可以继续吗?

请查看此文章中的评论。 - dferidarov
3个回答

50

你可以随时将底部窗格的输出复制,粘贴到顶部窗格中,并按下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,但变量实际上包含了整个命令。

此外,我不知道这与您是否使用存储过程有什么关系,或者为什么您要尝试“不使用存储过程”来完成它......此查询可以作为存储过程运行,也可以不作为存储过程运行,这完全取决于您调用它的频率、过程所在位置等等。


谢谢@Aaron。这正是我在寻找的。是的,我会按照你说的转换为SP。 - user2067567
是的,它本质上是对结果中每一行进行字符串连接。实际上,您也可以说SELECT @sql = @sql + N'...,事实上,在SQL Server 2005中,您必须这样做。这是在SQL Server 2008中引入的新语法。 - Aaron Bertrand

31

在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)

完美的答案,它对我也起作用了...非常感谢。 - Shirishkumar Bari
我更喜欢这个,因为它向你展示了如何针对特定的表进行操作,如果这是你的目标的话。 - AS7K
3
这个语句中有一个错误。如果约束名中有点,则执行将失败。您必须用方括号括起约束名:`DECLARE @SQL NVARCHAR(MAX) = '';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)`此外,如果您不想删除主键,则在WHERE子句中添加一个条件:AND [type] != 'PK' - Viktors Telle
1
感谢@ViktorsTelle。我遇到了一个问题,因为我的约束条件包含点。通过您的答案解决了这个问题。 - Aravin

6

对我来说,正确标记的问题无法解决。但是在 SQL Server 2017 中,以下内容对我有效:

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.objects
WHERE type_desc LIKE '%CONSTRAINT'
    AND OBJECT_NAME(PARENT_OBJECT_ID) LIKE 'your_table_name';

EXEC sp_executesql @sql;

3
虽然这篇只有代码的帖子可能会回答问题,但请添加一个说明它为什么能这样做的解释。这将有助于未来的读者评估答案是否适用于他们的情况。 - Tom Brunberg
@TomBrunberg,你为什么没有在其他两个仅包含代码的答案上发表同样的评论呢?你是特别询问Alexandre为什么这个解决方案可以修复他对已接受答案的问题吗?这可能是一个重要的区别,让他记住你为什么希望他改进这个答案。 - ruffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接