IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Supprimer toutes les colonnes d'une table à l'exception de certaines


Sujet :

Développement SQL Server

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 19
    Points : 11
    Points
    11
    Par défaut Supprimer toutes les colonnes d'une table à l'exception de certaines
    Bonjour,

    Ce message fait un peu suite a mon message précédent supprimer plusieurs colonnes en une seule requete.
    J'avais simplifié mon problème de façon à le rendre plus clair avant de le poster sur le forum mais finalement du coup je suis passé a coté de mon vrai problème.


    Voici mon problème, j'ai une table dans laquelle j'ai des colonnes a conserver (je connais le nom de celles-ci) et je dois supprimer toutes les autres (sans en connaitre leur nom)

    Par exemple j'ai une table "MaTable" qui contient les champs suivants : col1,col2,col3,col4,col5,col6,col7

    Je sais juste que je doit supprimer tous les champs de la table à l'exception de col1,col3 et col4. Le tout bien sur en ignorant que les autres colonnes s'appellent col2,col5,col6,col7

    J'ai donc une requete pour retrouver le nom de toutes les colonnes que je dois supprimer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT syscolumns.Name
      FROM syscolumns
           INNER JOIN sysobjects
             ON syscolumns.id = sysobjects.id
     WHERE sysobjects.name = 'MaTable'
       AND syscolumns.Name NOT IN ('col1', 'col3', 'col4')
    Résultat : col2,col5,col6,col7

    Et je voudrais faire un drop de ces colonnes mais la requete échoue lorsque je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE [MaTable] DROP COLUMN
    SELECT syscolumns.Name
      FROM syscolumns
           INNER JOIN sysobjects
             ON syscolumns.id = sysobjects.id
     WHERE sysobjects.name = 'MaTable'
       AND syscolumns.Name NOT IN ('col1', 'col3', 'col4')
    Résultat : Syntaxe incorrecte vers le mot clé 'SELECT'.

    (j'ai la même erreur si j'encapsule la sous-requête entre parenthèses)

    Existe-t-il une façon de répondre a mon besoin en une seule requete sans devoir passer par un curseur qui ferai une boucle de DROP COLUMN ?

    Edit : bon je ne suis pas borné je ne souhaite pas absolument avoir une seule requete pour faire cela mais j'aimerai au moins pouvoir me passer de la dizaine de lignes d'instructions qu'impliquerai l'utilisation d'un curseur.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    En une seule exécution, non pas moyen de le faire en SQL "pur".
    Par contre, vous pouvez générer vos ordres SQL et exécuter le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 'ALTER TABLE ' + so.Name + ' DROP COLUMN ' + sc.Name as req
      FROM syscolumns as sc
           INNER JOIN sysobjects as so
             ON so.id = sc.id
     WHERE so.Name = 'MaTable'
       AND sc.Name NOT IN ('col1', 'col3', 'col4')
    Par contre, confirmez-nous qu'il s'agit bien d'une opération exceptionnelle : vous ne faites pas des ADD / DROP column à tout bout de champ ?

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Merci pour votre réponse,
    Oui il s'agit d'une opération a caractère exceptionnel.

    Par contre sachant que tout ceci doit etre executé dans un script T-SQL je me retrouve donc obligé de passer par un curseur pour executer les ordres sql que m'a généré la requete précédente (celle que vous avez indiqué dans votre réponse), ce que je voulais éviter mais bon tant pis si j'ai pas le choix je vais procéder comme ça alors.

    Encore merci !

    (Et merci aussi pour la remise en forme de mon précédent message, en effet j'avais pas fait un post très propre)

  4. #4
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Si jamais ça peut servir ou intéresser quelqu'un voici le script complet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    -- Supprimer toutes les colonnes d'une table à l'exception de certaines dont on connait les noms
    DECLARE @NOM_TABLE AS VARCHAR(50)
    SET @NOM_TABLE = 'MATABLE'
    IF EXISTS ( SELECT name FROM sysobjects WHERE name = @NOM_TABLE AND type = 'U')
    BEGIN
    	DECLARE @SQL AS VARCHAR(MAX)
    	-- Déclaration du Curseur de sélection
    	DECLARE TEMPCURSEUR CURSOR 
    	FOR SELECT 'ALTER TABLE ['+ @NOM_TABLE +'] DROP COLUMN '+ syscolumns.Name AS SQLCMD
    			FROM syscolumns INNER JOIN sysobjects ON syscolumns.id = sysobjects.id 
    			WHERE sysobjects.name=@NOM_TABLE
    			AND syscolumns.Name NOT IN ('col1','col3','col4') --ici col1,col3,col4 représentent les seules colonnes que l'on souhaite conserver de la table
    	-- Déclaration du Curseur sur la liste des colonnes a supprimer
    	OPEN TEMPCURSEUR 
    	FETCH NEXT FROM TEMPCURSEUR INTO @SQL
    	WHILE (@@FETCH_STATUS >= 0)
    		BEGIN 
    			EXECUTE (@SQL)
    			IF @@ERROR != 0 
    				GOTO ROLLBACK_ON_ERROR
    			FETCH NEXT FROM TEMPCURSEUR INTO @SQL 
    		END
    	-- Fermeture du Curseur 
    	CLOSE TEMPCURSEUR 
    	-- Libération de la mémoire prise par le Curseur 
    	DEALLOCATE TEMPCURSEUR
    END
    COMMIT TRANSACTION 
    RETURN 
    ROLLBACK_ON_ERROR:
       ROLLBACK TRANSACTION

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Vous pouviez effectivement vous passer de curseur, et lancer un seul ordre DDL par table :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
     
    --suppression de toutes les colonnes de la table T, sauf col2 et col4
    DECLARE @SQL NVARCHAR(MAX)
     
    SELECT @SQL = 
    	CASE  
    		WHEN @SQL IS NULL THEN '' 
    		ELSE @SQL + ',' 
    	END 
    	+ COLUMN_NAME
    FROM  INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'T'
    	AND COLUMN_NAME NOT IN ('col2', 'col4')
     
    SET @SQL = 'ALTER TABLE T DROP COLUMN ' + @SQL
     
    EXEC sp_executesql @SQL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. nom de toutes les colonnes d'une table
    Par jeorcal dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/07/2010, 22h31
  2. Recherche sur toutes les colonnes d'une table
    Par Romain_marine dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/04/2010, 14h35
  3. Supprimer toutes les contraintes d'une table
    Par pouss dans le forum SQL
    Réponses: 2
    Dernier message: 01/12/2008, 16h27
  4. Supprime toutes les lignes d'une table fichier
    Par Loko dans le forum WinDev
    Réponses: 38
    Dernier message: 10/12/2007, 16h21
  5. Réponses: 6
    Dernier message: 01/08/2006, 18h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo