2011-02-01 5 views
18

Dans Oracle, de laisser tomber toutes les tables et les contraintes que vous taperez quelque chose commeSQL Server: drop table en cascade équivalent?

DROP TABLE myTable CASCADE CONSTRAINTS PURGE; 

et ce serait supprimer complètement les tables et leurs dépendances. Quel est l'équivalent du serveur SQL?

+0

a répondu à: http://stackoverflow.com/questions/2247268/t-sql-drop-table-cascade-constraints-equivalent – rizzle

Répondre

22

Je ne crois pas que SQL ait une solution aussi élégante. Vous devez d'abord supprimer les contraintes liées avant de pouvoir supprimer la table. Heureusement, tout cela est stocké dans le schéma d'information et vous pouvez y accéder pour obtenir votre liste de whack.

Ce billet de blog devrait être en mesure de vous obtenir ce dont vous avez besoin: http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

-- t-sql scriptlet to drop all constraints on a table 
DECLARE @database nvarchar(50) 
DECLARE @table nvarchar(50) 

set @database = 'DatabaseName' 
set @table = 'TableName' 

DECLARE @sql nvarchar(255) 
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table) 
BEGIN 
    select @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @table 
    exec sp_executesql @sql 
END 
29

Dans SQL Server Management Studio, accédez au serveur Options/SQL l'Explorateur d'objets/script et activer « Générer un script pour dépendante objets'. Puis faites un clic droit sur la table, script> drop to> nouvelle fenêtre de requête et elle le générera pour vous.

+0

Fonctionne également pour supprimer tous les objets dans un db. Un autre exemple de la puissance impressionnante de SSMS. m'a sauvé scripting moi-même de sys.objects !! –

+1

Pas si bonne solution pour OP, maintenant je comprends pourquoi il est désactivé par défaut.D'une manière ou d'une autre, toutes les tables sont "dépendantes" de la table "ContactInfo" ... –

5

Cela peut être une solution horrible, mais je trouve que c'est rapide. Il est similaire à la réponse de Vinnie, mais le produit de l'instruction SQL est une autre série d'instructions SQL qui va supprimer toutes les contraintes et tables.

(
select 
    'ALTER TABLE ' + tc.table_name + ' DROP CONSTRAINT ' + tc.constraint_name + ';' 
from 
    INFORMATION_SCHEMA.TABLES t 
    ,INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
where 
    t.table_name = tc.table_name 
    and tc.constraint_name not like '%_pk' 
    and tc.constraint_name not like 'pk_%' 
    and t.table_catalog='<schema>' 
) UNION (
select 
    'DROP TABLE ' + t.table_name + ';' 
from 
    INFORMATION_SCHEMA.TABLES t 
where 
    t.table_catalog='<schema>' 
) 
1

En fin de compte, nous supprimons notre tableau. Nous pouvons simplement lancer 2 commande suivante:

ALTER TABLE ... DROP CONSTRAINT ...

DROP TABLE ...

1> ALTER TABLE PRJ_DETAILS DROP CONSTRAINT FK_PRJ_TYPE;

- Nom de la table et le nom sont Constraint le paramètre

2> DROP TABLE.

Première contrainte de dépôt avec son nom associé à la table Vous pouvez ensuite supprimer la table.

Cela a fonctionné pour moi et c'est facile aussi.

1

Ceci est d'autant amusement et jeux jusqu'à une table de référence de votre table ...

Alors je dois modifier le code fourni comme ceci:

CREATE PROCEDURE _cascadeConstraints @database nvarchar(30) = NULL, @table nvarchar(60) = NULL 
as 
DECLARE @sql nvarchar(255) 
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table) 
BEGIN 
    select @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @table 
    select @sql = 'ALTER TABLE ' + tc.TABLE_NAME + ' DROP CONSTRAINT ' + tc.CONSTRAINT_NAME 
     from INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc join 
        INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on 
        (rc.CONSTRAINT_CATALOG = tc.CONSTRAINT_CATALOG and 
        rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME) join 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc_pk on 
        (tc_pk.CONSTRAINT_CATALOG = rc.CONSTRAINT_CATALOG and 
        tc_pk.CONSTRAINT_NAME = rc.UNIQUE_CONSTRAINT_NAME) 
    where tc.constraint_catalog = @database 
     and tc_pk.TABLE_NAME = @table 
    exec sp_executesql @sql 
END 
go 
0

J'ai juste besoin de supprimer la clé étrangère

DECLARE @database nvarchar(50) 
DECLARE @TABLE_NAME nvarchar(250) 
DECLARE @CONSTRAINT_NAME nvarchar(250) 
DECLARE @sql nvarchar(350) 
set @database = 'XXX' 


DECLARE db_cursor CURSOR FOR 
select TABLE_NAME, CONSTRAINT_NAME from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and CONSTRAINT_TYPE='FOREIGN KEY' 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    select @sql = 'ALTER TABLE ' + @TABLE_NAME + ' DROP CONSTRAINT ' + @CONSTRAINT_NAME 
    from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where constraint_catalog = @database and 
      table_name = @TABLE_NAME 
    exec sp_executesql @sql 

     FETCH NEXT FROM db_cursor INTO @TABLE_NAME, @CONSTRAINT_NAME 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
Questions connexes