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 :

Problème d'utilisation du IF avec une table temporaire


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut Problème d'utilisation du IF avec une table temporaire
    Bonjour,

    Basé sur l'existence ou non de tables, je souhaite insérer des enregistrements dans une nouvelle table.

    Tout fonctionne si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF OBJECT_ID('[Table1]') IS NOT NULL 
    		SELECT *
    		INTO NewTable 
    		FROM Table1
     
    ELSE IF OBJECT_ID('[Table2]') IS NOT NULL 
    		SELECT *
    		INTO NewTable 
    		FROM Table2
    Par contre, j'ai une erreur si je cherche à créer une table temporaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF OBJECT_ID('[Table1]') IS NOT NULL 
    		SELECT *
    		INTO ##NewTable 
    		FROM Table1
     
    ELSE IF OBJECT_ID('[Table2]') IS NOT NULL 
    		SELECT *
    		INTO ##NewTable 
    		FROM Table2
    Il me dit que "il existe déjà un objet nommé '##NewTable' dans la base de données"... (et la deuxième apparition de ##NewTable est soulignée en rouge)

    J'ai du mal à comprendre pourquoi j'ai cette erreur
    Est ce que vous savez à quoi cela peut être du?

    Merci par avance pour vos réponses

    Petite précision: avant de lancer la requête je m'assure que les tables sont effacées!
    Lionel Garnier

    N'oubliez pas de voter pour les posts en cliquant sur le
    Cliquez sur le bouton lorsque vous êtes satisfaits de la réponse!
    mon site pro

  2. #2
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Citation Envoyé par yonnel Voir le message
    Petite précision: avant de lancer la requête je m'assure que les tables sont effacées!
    Effacées ou supprimées ? Il faut faire un DROP TABLE avant.
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  3. #3
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Supprimé completement avec un DROP TABLE.

    En fait mon code ressemble plutot à ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    IF OBJECT_ID('tempdb..[##NewTable]') IS NOT NULL DROP TABLE [##NewTable]
     
    IF OBJECT_ID('[Table1]') IS NOT NULL 
    		SELECT *
    		INTO ##NewTable 
    		FROM Table1
     
    ELSE IF OBJECT_ID('[Table2]') IS NOT NULL 
    		SELECT *
    		INTO ##NewTable 
    		FROM Table2
    Lionel Garnier

    N'oubliez pas de voter pour les posts en cliquant sur le
    Cliquez sur le bouton lorsque vous êtes satisfaits de la réponse!
    mon site pro

  4. #4
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Pourquoi ne pas faire ceci plutot ? C'est vrai que je n'aime pas trop le select into par rapport à l'insert into...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    IF OBJECT_ID('tempdb..[##NewTable]') IS NULL
    CREATE TABLE [##NewTable] (col1 int, col2 varchar(50), ...)
     
    IF OBJECT_ID('[Table1]') IS NOT NULL 
    		INSERT INTO ##NewTable
    		SELECT *
    		FROM Table1
     
    ELSE IF OBJECT_ID('[Table2]') IS NOT NULL 
    		INSERT INTO ##NewTable
    		SELECT *
    		FROM Table2
    Blog Perso | Kankuru (logiciel gratuit pour SQL Server)

  5. #5
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Salut Darkelend,

    Merci beaucoup pour ta réponse.
    C'est effectivement une solution mais je voulais l'éviter car le type de mes colonnes peut changer d'une table source à l'autre. La solution INSERT INTO me permet donc de gérer les choses bien plus facilement...

    Car la situation réelle est plus complexe que le bout de code que je montre ici... Mais le problème que je rencontre vient de là!

    Avant de partir vers une solution alternative, j'aimerais bien comprendre ce qui ne va pas dans mon bout de code

    Bug SQL server? Problème de conception? ...
    Lionel Garnier

    N'oubliez pas de voter pour les posts en cliquant sur le
    Cliquez sur le bouton lorsque vous êtes satisfaits de la réponse!
    mon site pro

  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,

    Lorsque SQL Server parse votre code, il détecte deux INSERT INTO vers la même table, et considère donc que la deuxième exécution n'est pas correcte : il ne "voit" pas le branchement avec le IF qui empêche que ces deux instructions s’exécutent.

    de la même façon, si dans un meme lot vous ajoutez une colonne a une table puis vous faites une requete dessus, vous aurez un message d'erreur indiquant que la colonne n'existe pas (alors qu'elle vient d'etre ajoutée ! )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    ALTER TABLE UneTable
    	ADD UneColonne varchar(30) NULL
     
    SELECT UneColonne 
    FROM UneTable
    Pour contourner le problème vous pouvez mettre vos SELECT INTO dans un EXEC, les commandes seront alors parsées au moment de l'execution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IF OBJECT_ID('tempdb..[##NewTable]') IS NOT NULL DROP TABLE [##NewTable]
     
    IF OBJECT_ID('[Table1]') IS NOT NULL 
    		EXEC('SELECT *
    		INTO ##NewTable 
    		FROM Table1')
     
    ELSE IF OBJECT_ID('[Table2]') IS NOT NULL 
    		EXEC('SELECT *
    		INTO ##NewTable 
    		FROM Table2')

  7. #7
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2007
    Messages
    169
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2007
    Messages : 169
    Points : 241
    Points
    241
    Par défaut
    Merci beaucoup pour l'explication!
    Lionel Garnier

    N'oubliez pas de voter pour les posts en cliquant sur le
    Cliquez sur le bouton lorsque vous êtes satisfaits de la réponse!
    mon site pro

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

Discussions similaires

  1. [sfGuard] Utilisation de sfGuardPlugin avec une table User existante
    Par oOZarkOo dans le forum Plugins
    Réponses: 8
    Dernier message: 17/08/2011, 11h00
  2. Utilisation de TdbLookUpCombo avec une table TAdoTable
    Par gilardino dans le forum Composants VCL
    Réponses: 3
    Dernier message: 01/08/2008, 11h00
  3. [reflection] Comment utiliser la reflection avec une table ?
    Par leraptor dans le forum Général Java
    Réponses: 8
    Dernier message: 18/01/2008, 11h45
  4. Comment utiliser un BLOB avec une table ACCESS ?
    Par colorid dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/07/2007, 18h46
  5. Réponses: 4
    Dernier message: 09/05/2006, 10h29

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