Удалить все ограничения в таблице

Я пытаюсь написать script для удаления ограничений.

У меня есть функция ниже, чтобы выбрать Constarints в моей базе данных

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? Или любые легкие способы, которые я могу продолжить?

Ответ 1

Ну, вы всегда можете скопировать вывод из нижней панели, вставить его в верхнюю панель и нажать 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. Обратите внимание, что вывод печати будет усечен до 8K в Management Studio, но переменная действительно содержит всю команду.)

Кроме того, я не знаю, как это действительно связано с тем, используете ли вы хранимую процедуру или нет, или почему вы пытаетесь сделать это "без перехода на SP"... этот запрос можно запустить как хранимой процедуры или нет, все зависит от того, как часто вы собираетесь называть его, где находится процедура и т.д.

Ответ 2

Это работало для меня в 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) при готовности к запуску

Ответ 3

Правильный вопрос не работает для меня. Но это работает для меня в 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;