web-dev-qa-db-fra.com

Supprimer toutes les contraintes dans une table

J'essaie d'écrire un script pour supprimer les contraintes.

J'ai la fonction ci-dessous pour sélectionner les Constarints dans ma base de données

SELECT  name
    FROM sys.foreign_keys

Et j'ai écrit d'autres scripts en utilisant les scripts ci-dessus

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

En utilisant la requête ci-dessus, comment puis-je exécuter ces contraintes? 

Je peux utiliser DROP DATABASE DBName. Mais j'essaie simplement de supprimer des tables en supprimant des contraintes.

est-ce possible sans passer à SP? Ou des moyens faciles que je peux procéder?

12
user2067567

Eh bien, vous pouvez toujours copier la sortie du volet inférieur, la coller dans le volet supérieur et appuyer sur F5. Ou vous pouvez construire une chaîne à exécuter directement:

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;

(Lorsque vous êtes satisfait de la sortie PRINT, commentez-la et décommentez la EXEC. Notez que la sortie imprimée sera tronquée à 8 Ko dans Management Studio, mais la variable contient réellement la commande entière.)

En outre, je ne sais pas en quoi cela est lié au fait que vous utilisiez une procédure stockée ou non, ou pourquoi vous essayez de le faire "sans passer par SP" ... cette requête peut être exécutée sous forme de procédure stockée ou non, tout dépend de la fréquence à laquelle vous allez l'appeler, de l'endroit où la procédure vit, etc.

32
Aaron Bertrand

Cela a fonctionné pour moi dans 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)

Bien sûr, décommentez le EXECUTE(@SQL) lorsque vous êtes prêt à exécuter

18
BrownsFan

La question correctement marquée ne fonctionne pas pour moi. Mais cela fonctionne pour moi dans 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;
1
Alexandre Piva