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

Langage SQL Discussion :

Select sur des champs inexistants


Sujet :

Langage SQL

  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut Select sur des champs inexistants
    Salut à tous, je me pose une petite problématique.
    Je dois faire évoluer un petit utilitaire qui se connecte à des* bases de données. L'évolution aura pour effet collatéral l'ajout d'un champs dans une des tables.
    * l'utilitaire rentre dans un process de préparation de bases qui seront ensuite installées chez les clients

    Le problème étant que cet utilitaire devra rester compatible avec des bases créées antérieurement à la modif, donc sans cette colonne.

    Donc ma question est, existe-il une syntaxe sql simple, directement dans le select, un peu à l'image de ce que peu faire coalesce pour les valeurs, qui renverrait une valeur par défaut (NULL en l’occurrence ici, ou une chaine vide) à la place de la colonne manquante et en lieu et place de lever une exception.

    Quand je parle de syntaxe simple, c'est pour éviter les montages à base de IF machin et la gestion de 2 requêtes différentes suivant la version de base, ou même de IF machin ALTER TABLE pour rajouter la colonne manquante avant exécution. Cette solution ALTER TABLE n'étant pas forcément très intègre puisqu'elle modifie une base potentiellement déjà validée.


    PS : En cas de solution spécifique à un SGBD, on tourne pour le moment en SQLServer 2008, mais ça pourrait évoluer à moyen/long terme
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    A part aller consulter le catalogue pour vérifier l'existence ou non de la colonne dans la table, je ne vois pas

    Cette consultation peut bien sur être faite par requête depuis l'outil en question, le principe restera le même quelque soit le SGBD, mais la syntaxe sera forcément différente, le catalogue étant spécifique à chaque SGBD

  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
    21 768
    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 768
    Points : 52 577
    Points
    52 577
    Billets dans le blog
    5
    Par défaut
    Il n'y a qu'une seule solution qui est de faire du SQL dynamique. En effet si vous mettez le nom d'une colonne qui peut exister dans certaines base et pas d'autre d'autre, dans une requête, une exception sera levée avant même l'exécution de la requête, au cours de l'analyse syntaxique.

    Une des solution que je préconise pour ce genre de chose est d'utiliser un procédure stockée générique qui fait tout le boulot. On lui passe un flux XML avec toutes les info (noms des tables, jointures, colonnes renvoyées, filtres divers, valeurs de filtrage) et on parse cela dans la procédure pour générer le texte d'une requête dynamique qui sera ensuite exécutée.

    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
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 801
    Points
    30 801
    Par défaut
    Il sera toujours nécessaire d'utiliser deux requêtes, l'une avec la nouvelle colonne, l'autre sans.
    Même si fonctionnellement une branche de la requête ne sera pas exécutée en cas d'absence de la colonne, elle sera quand même vérifiée d'un point de vue syntaxique.
    En effet, l'analyseur syntaxique, après avoir vérifié la grammaire de la requête, va s'assurer que tous les objets auxquelles elle fait référence existent bien dans le dictionnaire.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Ok merci.

    Citation Envoyé par escartefigue Voir le message
    A part aller consulter le catalogue pour vérifier l'existence ou non de la colonne dans la table, je ne vois pas
    Oui c'est le montage IF machin que j'évoquais

    Citation Envoyé par SQLpro Voir le message
    Il n'y a qu'une seule solution qui est de faire du SQL dynamique. .......
    Ok.
    Pourquoi pas si une base en production, cela pourrait être une solution.
    Ici, cette table, et donc cette colonne ne sont utilisées que pour la phase de préparation de la base, même si ensuite la table est conservée en guise d'archive elle pourrait être supprimée lorsqu'on pose la base chez le client.
    Donc je pense que je vais rester sur des choses plus basiques.

    Il n'y a donc pas de solutions plus simple que les 2 requêtes distinctes ou alors rajouter systématiquement la colonne.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    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
    Bonjour,

    Une solution bricolée avec du XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT  e.value('.', 'INT') AS LaNouvelleColonne
    FROM LaTable Tbl
    CROSS APPLY ( SELECT CAST((SELECT Tbl.* FOR XML PATH('')) AS XML)) AS T(x)
    OUTER APPLY x.nodes('LaNouvelleColonne') AS R(e)

    Si la nouvelle colonne n'existe pas, on obtient du NULL.

    Bon, je dis pas que c'est joli... mais ça fonctionne.

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Sinon, quitte à créer une nouvelle colonne, pourquoi ne pas créer une vue ?

    Le SELECT de la vue est déterminé au moment de l'installation de l'utilitaire.
    Et elle renvoie la colonne ou NULL selon si la colonne existe ou non
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. Select sur des nombre décimaux de format 0.*
    Par CanardJM dans le forum Langage SQL
    Réponses: 8
    Dernier message: 18/08/2005, 16h04
  2. [SELECT] Faire un select avec des champs vides
    Par MinsK dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/08/2005, 00h05
  3. pb avec select sur deux champs
    Par graphicsxp dans le forum Langage SQL
    Réponses: 7
    Dernier message: 22/03/2005, 15h30
  4. Boucler sur des champs texte
    Par syl2095 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/11/2004, 16h15
  5. select sur un champ de type LONG
    Par ppd dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2004, 18h19

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