删除表中的所有约束

use*_*567 17 constraints sql-server-2008

我试图编写用于删除约束的脚本.

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

SELECT  name
    FROM sys.foreign_keys
Run Code Online (Sandbox Code Playgroud)

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

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(parent_object_id) + 
    ' DROP CONSTRAINT ' + name
FROM sys.foreign_keys
Run Code Online (Sandbox Code Playgroud)

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

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

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

Aar*_*and 37

您可以随时复制底部窗格中的输出,将其粘贴到顶部窗格中,然后按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;
Run Code Online (Sandbox Code Playgroud)

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

另外我不知道这与你是否正在使用存储过程有什么关系,或者为什么你试图"不使用SP"...这个查询可以作为存储过程运行或者不是,这一切都取决于你打电话的频率,手术所在的地方等等.


小智 20

这在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)
Run Code Online (Sandbox Code Playgroud)

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

  • 这个说法有一个错误。如果约束名称的名称中包含点,则执行将失败。您必须将约束名称括在方括号中:`DECLARE @SQL NVARCHAR(MAX) = ''; SELECT @SQL += N' ALTER TABLE ' + OBJECT_NAME(PARENT_OBJECT_ID) + 'DROP CONSTRAINT [' + OBJECT_NAME(OBJECT_ID) + '];' 从 SYS.OBJECTS WHERE TYPE_DESC LIKE '%CONSTRAINT' AND OBJECT_NAME(PARENT_OBJECT_ID) = 'YOUR_TABLE'; --PRINT (@SQL) EXECUTE(@SQL)` 另外,如果您不想删除主键,则在 WHERE 子句中再添加一个条件:`AND [type] != 'PK'` (2认同)

Ale*_*iva 5

正确标记的问题对我不起作用。但这在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;
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个只有代码的帖子可能会回答这个问题,但请添加解释为什么这样做。这将有助于未来的读者根据他们的情况评估答案。 (3认同)