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?
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.
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
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;