Précédent   Forum du club des développeurs et IT Pro > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 31/12/2012, 11h37   #1
yonnel
Membre actif
 
Homme Lionel Garnier
Consultant informatique
Inscription : octobre 2007
Messages : 144
Détails du profil
Informations personnelles :
Nom : Homme Lionel Garnier
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2007
Messages : 144
Points : 193
Points : 193
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 :
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 :
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!
Pour me contacter ou aller plus loin: mon site pro
yonnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 11h59   #2
darkelend
Membre confirmé
 
Inscription : août 2009
Messages : 204
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 204
Points : 263
Points : 263
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.
__________________
http://www.kankuru.fr/blog.aspx
darkelend est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 12h02   #3
yonnel
Membre actif
 
Homme Lionel Garnier
Consultant informatique
Inscription : octobre 2007
Messages : 144
Détails du profil
Informations personnelles :
Nom : Homme Lionel Garnier
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2007
Messages : 144
Points : 193
Points : 193
Supprimé completement avec un DROP TABLE.

En fait mon code ressemble plutot à ca:
Code :
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!
Pour me contacter ou aller plus loin: mon site pro
yonnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 13h28   #4
darkelend
Membre confirmé
 
Inscription : août 2009
Messages : 204
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 204
Points : 263
Points : 263
Pourquoi ne pas faire ceci plutot ? C'est vrai que je n'aime pas trop le select into par rapport à l'insert into...
Code :
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
__________________
http://www.kankuru.fr/blog.aspx
darkelend est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2012, 13h54   #5
yonnel
Membre actif
 
Homme Lionel Garnier
Consultant informatique
Inscription : octobre 2007
Messages : 144
Détails du profil
Informations personnelles :
Nom : Homme Lionel Garnier
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2007
Messages : 144
Points : 193
Points : 193
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!
Pour me contacter ou aller plus loin: mon site pro
yonnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2013, 14h55   #6
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 689
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 689
Points : 2 662
Points : 2 662
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 :
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 :
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')
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/01/2013, 15h01   #7
yonnel
Membre actif
 
Homme Lionel Garnier
Consultant informatique
Inscription : octobre 2007
Messages : 144
Détails du profil
Informations personnelles :
Nom : Homme Lionel Garnier
Localisation : France, Somme (Picardie)

Informations professionnelles :
Activité : Consultant informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2007
Messages : 144
Points : 193
Points : 193
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!
Pour me contacter ou aller plus loin: mon site pro
yonnel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h45.


 
 
 
 
Partenaires

Hébergement Web