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

SQL Firebird Discussion :

Existence d'un champ


Sujet :

SQL Firebird

  1. #1
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 36
    Points
    36
    Par défaut Existence d'un champ
    Bonjour,

    J'ai une application c# qui charge un fichier sql pour mettre à jour ma base de données firebird embeded.

    Je voudrais savoir comment tester l'existence d'un champs en sql avant de lancer un alter table.
    Si MonChamps existe alors je fais rien
    sinon j'execute l'alter table... pour créer mon champs.

    Je ne peux pas le faire en C# mais je dois le faire directement dans mon script sql.

    Une idée?

    Ludo

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 36
    Points
    36
    Par défaut
    Cette requete me retourne 'COMMENTAIRE' si le champs existe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     SELECT RDB$FIELD_NAME
      FROM RDB$RELATION_FIELDS
     WHERE RDB$RELATION_NAME='MATERIEL' and upper(RDB$FIELD_NAME) ='COMMENTAIRE'
    Maintenant il faudrait inclure cela dans un script.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 36
    Points
    36
    Par défaut
    Salut,

    J'essai de me faire une procédure pour vérifier l'existence d'un champs avant de lancer un alter mais je ne m'en sors pas:

    Mon code:
    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
    create procedure CheckField (FieldName varchar(15), TableName varchar(25))
    returns (Exist INTEGER)
    AS BEGIN
    FOR SELECT RDB$FIELD_NAME
    FROM RDB$RELATION_FIELDS
    WHERE RDB$RELATION_NAME=TableName and upper(RDB$FIELD_NAME) =FieldName into :test
    DO BEGIN
    if (:test = FieldName) then 
    begin 
          Exist=1;
    end;
    else 
          Exist=0
    suspend; 
    END
    Qui pourrait m'aider sur ce coup

    Ludo

  4. #4
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Tu peux utiliser IF EXISTS 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
    14
    15
    16
    17
    18
     
    CREATE PROCEDURE CheckField (
      FieldName VARCHAR(31),
      TableName VARCHAR(31))
    RETURNS (
      Exist INTEGER)
    AS
    BEGIN
      IF (EXISTS (
        SELECT RDB$FIELD_NAME
        FROM RDB$RELATION_FIELDS
        WHERE RDB$RELATION_NAME = :TableName AND
          UPPER(RDB$FIELD_NAME) = :FieldName)) THEN
        Exist = 1;
      ELSE
        Exist = 0;
      SUSPEND; 
    END
    @+ Claudius

  5. #5
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 36
    Points
    36
    Par défaut
    Salut,

    Merci pour ton aide mais le script ne fonctionne pas!
    Batch execution aborted
    J'obtiens un dynamic sql error error -104
    Error code: 335544851

    Il a l'air de se planter sur ou après le exist=1

    J'utilise la version 2.0.X de firebird en mode embeded

  6. #6
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    ben ça, en utilisant un mot réservé comme nom de variable, rien d'étonnant
    ceci dit je ne vois pas bien l'interet de la manoeuvre
    si un champ existe déjà, la création échouera et basta
    rien de bien grave
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  7. #7
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 36
    Points
    36
    Par défaut
    Salut,

    J'ai changé Exist par FieldExist mais pas mieux.
    La manoeuvre consiste à passer un script sql pour mettre à jour une bdd. Mon problème est que je ne peux pas identifier l'état de la base lors du téléchargement du script.
    J'essai donc de détecter la présence d'un champs avant de lancer sa création.

    En cas de plantage, la suite du script n'est pas exécuter...

    Je sais pas pourquoi mais il "coupe" le script après "=1;"

    Ludo

  8. #8
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par makowski Voir le message
    ben ça, en utilisant un mot réservé comme nom de variable, rien d'étonnant
    Beuh, où ça un mot clé réservé ? Exist ?

  9. #9
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    en plus elle marche très bien cette procédure
    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
    SET TERM ^^;
    CREATE PROCEDURE CheckField (
      FieldName VARCHAR(31),
      TableName VARCHAR(31))
    RETURNS (
      FieldExist INTEGER)
    AS
    BEGIN
      IF (EXISTS (
        SELECT RDB$FIELD_NAME
        FROM RDB$RELATION_FIELDS
        WHERE RDB$RELATION_NAME = :TableName AND
          UPPER(RDB$FIELD_NAME) = :FieldName)) THEN
        FieldExist = 1;
      ELSE
        FieldExist = 0;
      SUSPEND; 
    END
    ^^
    SET TERM ;^^
    COMMIT;
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  10. #10
    Membre expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Points : 3 712
    Points
    3 712
    Par défaut
    Citation Envoyé par rangdalf Voir le message
    Je sais pas pourquoi mais il "coupe" le script après "=1;"
    SET TERM
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  11. #11
    Nouveau membre du Club
    Inscrit en
    Février 2004
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 70
    Points : 36
    Points
    36
    Par défaut
    Oui effectivement avec un set term ca marche!

    Merci à vous 2!

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

Discussions similaires

  1. Tester l'existence d'un champ dans une requête
    Par Reidid dans le forum Access
    Réponses: 3
    Dernier message: 23/01/2006, 22h02
  2. Tester l'existance d'un champ de formulaire .
    Par maxos75 dans le forum ASP
    Réponses: 3
    Dernier message: 21/12/2005, 12h47
  3. Tester l'existence d'un champ dans une table
    Par Oluha dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 05/09/2005, 11h19
  4. existance d un champ dans un formaulaire
    Par ddmonge dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 16/03/2005, 11h02
  5. Tester l'existence d'un champ
    Par Loko dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/12/2004, 11h26

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