24

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

我有以下功能来选择我的数据库中的约束

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有可能吗?或者我可以继续的任何简单方法?

4

3 回答 3

47

好吧,您总是可以从底部窗格复制输出,将其粘贴到顶部窗格中,然后按 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”... 这个查询可以作为存储过程运行,或者不是,这完全取决于您调用它的频率、程序所在的位置等。

于 2013-04-03T11:37:36.697 回答
28

这在 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)when ready to run

于 2014-04-07T13:58:13.790 回答
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;
于 2018-02-12T19:23:02.040 回答