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 :

Attaquer le nom d'une colonne dans un where grâce à une variable du type chaine ?


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Par défaut Attaquer le nom d'une colonne dans un where grâce à une variable du type chaine ?
    Bonjour,

    J'ai un petit souci :

    D'un côté, j'ai une table dont je ne connais pas les noms de colonnes (sauf la première qui ne change jamais) et qui peuvent être modifiées ou supprimées à n'importe quel moment.
    En effet, cette table est importée depuis un fichier fourni que je ne maîtrise pas, on me l'envoi chaque nuit tel quel, et ses noms de colonnes peuvent changer à tout moment.
    Bon, jusque-là, cela ne pose pas de problème pour moi, j'importe ce fichier dans une table de ma base, sans problème.

    Par exemple, il s'agirait d'une Table "Caractéristiques" qui après import apparaîtrait comme ceci :
    -------------------------------------------------------
    REF1 | "CAR1" | "CAR2" | "CAR3" | CAR"4" | ...etc....
    -------------------------------------------------------
    "R1" | "valA" | "valB" | "valC" | "valD" | ...etc....
    "R2" | "valD" | "valE" | "valF" | "valG" | ...etc....
    ..etc...
    -------------------------------------------------------
    Dans ces colonnes, j'ai une valeur dans la colonne "REF1" dont le nom de cette colonne est toujours présent et en première place.
    J'ai ensuite des noms de colonnes du type "CARxx" qui peuvent changer à tout moment de place ou de nom.... je sais juste qu'ils commencent tous par "CAR".
    Je sais donc lister ces noms de colonnes pour cette table, après import et grâce à une requête sql.

    Là où je bloque, c'est que j'aimerais faire un curseur (ou autre), me permettant de boucler sur chaque nom de colonne de cette table, afin de pouvoir, dans une procédure stockée, faire un traitement adaptée pour chaque colonne et les valeurs qu'elle contient.

    Par exemple faire un :
    select count(*) from Caractéristiques where REF1='R1' and "CAR1"='valA'
    Si la requête ci-dessus me donne un résultat, je dois faire un traitement derrière.

    Sauf que je ne vois pas comment faire ça....

    Mon point de départ était de créer un curseur en le renseignant avec une requête qui me retour les noms de colonnes, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT name as colname FROM sys.columns WHERE object_id = OBJECT_ID('Caractéristiques '
    retournerait ainsi :
    CAR1
    CAR2
    CAR3
    CAR4
    ...etc...
    Mais ensuite, avec ça dans mon curseur, pour chaque nom, je voudrais pouvoir attaquer ma table "Caractéristiques " par le nom de la colonne correspondante... en utilisant quelque chose du genre "COL_NAME()" de sql ?
    Mais j'ai pas trouvé comment faire, rien ne marche...

    Est-ce possible de faire quelque chose comme cela ?
    Peut-on, au lieu de mettre le nom de la colonne dans le where, utiliser une astuce pour l'ajouter à partir d'une variable du type chaine ?


    Merci pour toute l'aide que vous pourrez m'apporter....

    Cordialement.

  2. #2
    Membre éclairé Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Par défaut
    Est-ce possible d'attaquer les colonnes par un index au lieu du nom de la colonne ?
    Parce que avec une requête comme celle-ci, je connais leur position dans la table :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select COLUMN_NAME, ORDINAL_POSITION   from information_schema.columns where TABLE_NAME='Carractéristiques'

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Non, et c'est une erreur de modélisation que d'avoir des tables avec COL1, COL2, COL3... COLN

    Viol de la première forme normale par apocope !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Membre éclairé Avatar de Stephane_br
    Inscrit en
    Septembre 2005
    Messages
    222
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 222
    Par défaut
    Merci pour votre réponse.
    Je sais, mais le fichier que l'on me fourni est tel quel, ce n'est pas moi qui l'ai conçu. je dois m'en débrouiller, obligatoirement.....
    Je m'y arrache d'ailleurs les cheveux pour régler mon problème et pas que ma procédure soit trop lourde....

    J'ai finalement opté pour une "tâche de script en .NET" dans mon projet SSIS. En récupérant les noms des colonnes par une requête et la suite en .NET....
    Heureusement, c'est une procédure que je lance la nuit, cela ne me prend pas trop de temps et ne pénalise pas le reste de mes travaux...

    Merci quand même pour votre réponse.
    Je clôture ce ticket.
    Merci.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Tu peut le faire par du SQL dynamique…

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 06/11/2015, 15h50
  2. créer une colonne dans le résultat d'une requette
    Par timal78 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2007, 10h21
  3. [2.0] Mettre une Checkbox dans le header d'une colonne d'une DatagridView
    Par aurelien.tournier dans le forum Windows Forms
    Réponses: 5
    Dernier message: 23/01/2007, 10h27
  4. Réponses: 6
    Dernier message: 15/12/2005, 14h29

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