Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/03/2008, 13h26   #1
Candidat au titre de Membre du Club
 
Inscription : février 2004
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 70
Points : 11
Points : 11
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
rangdalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2008, 15h10   #2
Candidat au titre de Membre du Club
 
Inscription : février 2004
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 70
Points : 11
Points : 11
Cette requete me retourne 'COMMENTAIRE' si le champs existe.
Code :
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.
rangdalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 11h58   #3
Candidat au titre de Membre du Club
 
Inscription : février 2004
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 70
Points : 11
Points : 11
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 :
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
rangdalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 12h09   #4
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 760
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 760
Points : 6 790
Points : 6 790
Salut

Tu peux utiliser IF EXISTS comme ceci:
Code :
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
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 12h27   #5
Candidat au titre de Membre du Club
 
Inscription : février 2004
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 70
Points : 11
Points : 11
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
rangdalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 13h49   #6
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 14h03   #7
Candidat au titre de Membre du Club
 
Inscription : février 2004
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 70
Points : 11
Points : 11
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
rangdalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 14h07   #8
Modérateur
 
Avatar de Cl@udius
 
Homme Claude Renouleaud
Développeur informatique
Inscription : février 2006
Messages : 4 760
Détails du profil
Informations personnelles :
Nom : Homme Claude Renouleaud
Âge : 49
Localisation : France, Hautes Pyrénées (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2006
Messages : 4 760
Points : 6 790
Points : 6 790
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 ?
__________________
A la question technique que par MP/MV tu formuleras, la réponse aux oubliettes finira.
Cl@udius est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 14h50   #9
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
en plus elle marche très bien cette procédure
Code :
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 14h53   #10
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

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

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
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
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2008, 15h36   #11
Candidat au titre de Membre du Club
 
Inscription : février 2004
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2004
Messages : 70
Points : 11
Points : 11
Oui effectivement avec un set term ca marche!

Merci à vous 2!
rangdalf est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h01.


 
 
 
 
Partenaires

Hébergement Web