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 :

Equivalent du #if directive de précompilation [2008R2]


Sujet :

Développement SQL Server

  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 Equivalent du #if directive de précompilation
    Bonjour à tous,
    Dans un script sql, j'ai un souci de compatibilité avec plusieurs versions de base à mettre en place dans une requete insert.
    Pour résumer, pour des bases inférieures à un n° de version, on va dire 10 par exemple, j'ai une colonne A dans une table. Pour les bases en version 10 et plus, cette colonne n'existe plus, elle est remplacée par une nouvelle colonne B.

    Dans le script je dois gérer les 2 cas, j'ai donc fait ceci (je passe le n° de version en paramètre) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IF @Version >= 10
        INSERT (..., B, ...) VALUES (..., Valeur_B, ...)
    ELSE 
        INSERT (..., A, ...) VALUES (..., Valeur_A, ...)
    Ce code ne marche pas, sql server me jette à la compil car, ou l'une, ou l'autre des colonnes A ou B n'existe pas.

    En fait, c'est pas un IF qu'il me faudrait, mais l'équivalent de la condition de précompilation #IF qui existe dans certains langages.
    Est-ce que ça existe en sql server, ou sinon comment faire, sachant que je n'ai pas qu'une requête dans ce cas là, pas qu'un seul script, et d'autre viendront se rajouter dans l'avenir aussi ?
    --- Sevyc64 ---

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

  2. #2
    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 803
    Points
    30 803
    Par défaut
    Est-ce qu'il s'agit uniquement du changement du nom de colonne ou une modification fonctionnelle plus profonde ?

    Je verrais bien une vue qui remplace l'accès direct à la table et dans laquelle la colonne B est renommée A dans la nouvelle version.
    Et deux versions des triggers associés aux UPDATE/INSERT à compiler en fonction de la version de la base.
    C'est déjà un peu moins lourd qu'une modification de chaque opération...
    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.

  3. #3
    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
    Dans le cas présent, sur l'ensemble des tables gérées, j'ai un renommage, de la suppression, et de l'ajout de colonnes

    Sinon, et ça sera la cas le plus courant, ça sera, parfois de la suppression, mais surtout de l'ajout de colonnes, voire de tables entières.
    --- Sevyc64 ---

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

  4. #4
    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
    Bon, j'ai peut-être trouvé une solution détournée. Ca sera un peu plus lourd à maintenir (moins facile à lire) et on perd l'analyse syntaxique de l'ide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IF @Version >= 10
       exec( N'INSERT (..., B, ...) VALUES (..., Valeur_B, ...) ')
    ELSE 
       exec( N'INSERT (..., A, ...) VALUES (..., Valeur_A, ...) ')
    --- Sevyc64 ---

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

  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
    Ce n'est pas la bonne solution quand le bout de script fait référence à des variables du script global ou des paramètres qui lui sont passés
    --- 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,

    Dans ce cas, il faut faire un EXEC sp_executesql afin de pouvoir passer les paramètres en question

  7. #7
    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
    Bon, j'ai fais différemment.
    J'ai créé une variable locale type varchar, j'y ai concaténé le texte de ma requête avec les valeurs de paramètres comme ceci set toto = 'INSERT blabla' + @Monparam1 + 'blabla...', puis j’exécute le tout avec EXEC.

    Hormis le fait que c'est peut-être un peu moins propre, quelle différence en terme d’exécution avec EXEC sp_executesql ?
    --- Sevyc64 ---

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

  8. #8
    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
    Sur le principe, je dirais que :
    1/ cette méthode est sensible aux attaques par injection SQL
    2/ cette méthode génère des requêtes syntaxiquement différentes, avec donc non réutilisation des plans d'exécution.

    Cependant, dans votre cas (script de migration si j'ai bien compris), vous maitrisez le contenu de la variable, donc pas de problème pour le 1/, et soit l'une soit l'autre des requêtes sera en fait exécutée, et une seule fois, vous n'êtes donc pas non plus concerné par le 2/.

    Donc je ne vois pas de problème dans ce contexte précis.

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

Discussions similaires

  1. Directive EQUIVALENCE dans gfortran44
    Par palloy27 dans le forum Fortran
    Réponses: 7
    Dernier message: 22/11/2011, 13h12
  2. [Kylix] Equivalent ShellExec en CLX
    Par Anonymous dans le forum EDI
    Réponses: 7
    Dernier message: 14/08/2002, 11h55
  3. La communauté Direct X est au repos?
    Par Shakram dans le forum DirectX
    Réponses: 21
    Dernier message: 18/07/2002, 23h32
  4. Equivalent à ExeName pour une DLL
    Par Smortex dans le forum Langage
    Réponses: 7
    Dernier message: 16/07/2002, 21h07
  5. [Kylix] equivalent winsock avec kylix
    Par Victor dans le forum EDI
    Réponses: 2
    Dernier message: 08/05/2002, 07h43

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