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 :

Parcourir les colonnes d'une table


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut Parcourir les colonnes d'une table
    Bonjour,

    Je voudrais parcourir les colonnes d'une table à l'aide d'un curseur et d'un compteur défini à 10 par exemple.

    Ensuite, j'exécute la requête ci-dessous sur la première colonne de la table comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select colonne, count(*)
    from table
    group by colonne 
    having Count(*) > 1
    si le résultat de la requête est différent de null
    alors je stocke le nom de la colonne dans une variable que je concatene avec la seconde colonne
    et j'exécute la requête à nouveau avec les colonnes 1 et 2 comme ceci :

    variable = 'colonne1, colonne2'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select variable, count(*)
    from table
    group by variable
    having Count(*) > 1
    jusqu'à ce que la requete ci-dessous avec les différentes colonnes concaténées retourne null

    et enfin j'affiche le print du résultat.

    Merci,

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Intéressez vous au groupage OLAP avec ROLLUP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select <ma liste de toutes les colonnes>, count(*)
    from table
    group by ROLLUP (<ma liste de toutes les colonnes>)
    having Count(*) > 1
    A +

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Merci pour la solution proposée mais je cherche à utiliser des curseurs et parcourir les noms des colonnes une par une et identifier la ou les colonnes qui répondent à ma requête. J’aimerai par la suite adapter le script afin qu’il puisse fonctionner sur une autre base de données.

    Après je ne connais pas le ROLLUP.

    Merci,

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Alors votre besoin est mal décrit !

    Citation Envoyé par Jinkas99 Voir le message
    Après je ne connais pas le ROLLUP.
    Cela fait partie intégrante de la norme SQL.

    Lisez le livre que j'ai écrit sur le langage SQL : Nom : Couverture SQL Synthex 4e ed - 500.jpg
Affichages : 1456
Taille : 77,8 Ko

    A +

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    je voudrais par exemple parcourir les 3 premières colonnes d’une table en exécutant la requête ci-dessous. Je teste d’abord la requête avec la colonne 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select colonne1, count(*)
    from table
    group by colonne1
    having Count(*) > 1
    si cette dernière ne me retourne pas null alors j’exécute la requête avec la colonne 1 et 2 comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select colonne1, colonne 2, count(*)
    from table
    group by colonne1, colonne2
    having Count(*) > 1
    si cette dernière ne me retourne pas null alors j’exécute la requête avec la colonne 1, 2 et 3 comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select colonne1, colonne 2, colonne3,  count(*)
    from table
    group by colonne1, colonne2, colonne3
    having Count(*) > 1
    si elle ne me retourne pas null j’affiche aucun résultat sinon j’affiche les noms des colonnes qui ont permis à la requête de retourner null c’est à dire l’ensemble des colonnes qu’on retrouve dans le select.

    Ça peut-être la colonne1 ou la colonne2 ou la colonne3 ou la colonne1 et colonne2 ou colonne1 et colonne3 ou colonne2 et colonne3 ou toutes les colonnes.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    pas clair du tout.... En fait je présume que ce que vous voulez, c'est trouver quel pourrait être l'ensemble des colonnes de la table pouvant former une clef primaire de votre table ?

    C'est un besoin idiot, car la recherche d'une clef est un besoin fonctionnel et non technique....

    Mais si c'est cela votre diée alors une requête du genre ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT <liste de toutes mes colonnes candidate>
    FROM   MaTable
    GROUP  BY ROLLUP(<liste de toutes mes colonnes candidate>)
    HAVING COUNT(*) = (SELECT COUNT(*) FROM MaTable)
    Cela vous donnera des lignes à NULL correspondant aux colonnes clef.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT PSP_NOM, PSP_PRENOM, PSP_DATE_NAISSANCE, PSP_SOUNDEX
    FROM   S_PRS.T_PERSONNE_PHYSIQUE_PSP
    GROUP  BY ROLLUP(PSP_NOM, PSP_PRENOM, PSP_DATE_NAISSANCE, PSP_SOUNDEX)
    HAVING COUNT(*) = (SELECT COUNT(*) FROM S_PRS.T_PERSONNE_PHYSIQUE_PSP)
    A +

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Je vous remercie pour votre réaction.

    Je suis du même avis mais c'est une demande qui m'a été faite.

    Néanmoins, votre solution impose l'affichage de toutes les colonnes dans le select et au niveau du rollup.

    Comment je fais si je dois faire la même action sur plusieurs tables d'une base de données.

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 899
    Points : 53 140
    Points
    53 140
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Jinkas99 Voir le message
    Comment je fais si je dois faire la même action sur plusieurs tables d'une base de données.
    Vous les parcourez soit à l'aide d'un curseur, soit à l'aide de SQL dynamique

    A +

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Points : 58
    Points
    58
    Par défaut
    Est ce qu'il est possible de faire comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE @count INT = 0;
    DECLARE @COLONNES nvarchar(max) = 'colonne1,colonne2';
     
    BEGIN
    	SET @count = SELECT COUNT(*) 
    					FROM (SELECT @COLONNES
    						  FROM TABLE
    						  GROUP BY @COLONNES
    						  HAVING COUNT(*) > 1) A
     
    	print @count
    END;
    GO

  10. #10
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Non vous devez exécuter du SQL dynamique pour faire ce genre de chose.

Discussions similaires

  1. [SQL-Server] Lister les colonnes d'une table
    Par tintin31000 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 15/10/2008, 11h33
  2. parcourir les éléments d'une table
    Par Daniel MOREAU dans le forum Access
    Réponses: 1
    Dernier message: 14/01/2007, 17h50
  3. [ADO] Lister les colonnes d'une table DBF
    Par drouault dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/09/2006, 17h21
  4. Réponses: 6
    Dernier message: 01/08/2006, 18h12
  5. paramètrer les colonnes d'une table en VBA
    Par papilou86 dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/05/2006, 16h47

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