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

Пытаюсь написать скрипт для снятия ограничений.

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

SELECT  name
    FROM sys.foreign_keys

И я написал сценарии изменения, используя указанные выше сценарии.

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

Как я могу выполнить эти ограничения, используя приведенный выше запрос?

Я могу использовать DROP DATABASE DBName. Но я просто пытаюсь отбросить таблицы, отбросив ограничения.

можно ли без СП? Или какие-нибудь простые способы продолжить?


person user2067567    schedule 03.04.2013    source источник
comment
Проверьте комментарий в этой [статье] [1]. [1]: stackoverflow.com/a/6130023/2232256   -  person dferidarov    schedule 03.04.2013


Ответы (3)


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

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

person Aaron Bertrand    schedule 03.04.2013
comment
Спасибо @Aaron. это именно то, что я искал. Я конвертирую в SP, как вы сказали - person user2067567; 03.04.2013
comment
Да, по сути, это конкатенация строк по каждой строке результата. Вы также можете сказать SELECT @sql = @sql + N'... на самом деле, именно так вы должны были это сделать в SQL Server 2005. Это более новый синтаксис, представленный в SQL Server 2008. - person Aaron Bertrand; 03.04.2013

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

person BrownsFan    schedule 07.04.2014
comment
Идеальный ответ У меня тоже сработало ... Большое спасибо - person Shirishkumar Bari; 24.11.2014
comment
Я предпочитаю этот, потому что он показывает вам, как настроить таргетинг на определенные таблицы, если это ваша цель. - person AS7K; 22.02.2018
comment
В этом утверждении есть одна ошибка. Если имя ограничения будет содержать точки, выполнение завершится ошибкой. Вы должны заключить имя ограничения в квадратные скобки: 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' - person Viktors Telle; 13.07.2018
comment
Спасибо @ViktorsTelle. У меня возникла проблема, поскольку мое ограничение содержит точки. Решено вашим ответом. - person Aravin; 05.01.2021

Правильно помеченный вопрос мне не подходит. Но у меня это работает в 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;
person Alexandre Piva    schedule 12.02.2018
comment
Хотя это сообщение, содержащее только код, может дать ответ на вопрос, пожалуйста, объясните, почему он это делает. Это поможет будущим читателям оценить ответ для своей ситуации. - person Tom Brunberg; 13.02.2018