Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 10/02/2011, 13h36   #1
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
Par défaut problème sur des table temporaire

bonjour;

j'ai créée une procédure stockées dans laquelle j'ai utilisé des tables temporaires. mais j'ai un soucie quand je rééxecute une autre fois la proc.
j'ai l'erreur suivante :

Msg 2714, Level 16, State 1, Procedure proc_A, Line 83
There is already an object named '#Temp_FACT' in the database.

Msg 2714, Level 16, State 1, Procedure proc_A, Line 147

There is already an object named '#Temp__EST' in the database.

apparemment les table sont enregistrées quelques parts dans la BD c'est pour ça que j'ai cette erreur.

pourriez vous m'aider svp
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 14h11   #2
Futur Membre du Club
 
Inscription : octobre 2008
Messages : 99
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 99
Points : 17
Points : 17
Ta table temporaire continue à vivre toute la durée de la session.
Fais un drop table #toto à la fin si tu veux la supprimer.
abbepierre94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 14h13   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Quand vous créez une table temporaire, celle_ci est créée dans tempDB.
Pensez dans vos Procédures stockées à supprimer ces tables en fin de script.
Vous pouvez en outre vérifier leur existence en début de procédure et les dropper...
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h18   #4
Invité de passage
 
Inscription : avril 2008
Messages : 65
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 65
Points : 3
Points : 3
rebonjour;


j'ai fait cette ligne de code au début de ma proc mais toujours j'ai le message d'erreur je ne sais pas peut etre j'ai mal codé:

IF OBJECT_ID('tempdb..#Temp_PFDV_FACT ') IS NOT NULL

DROP TABLE #Temp_PFDV_FACT
xavier81 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h39   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Votre table temporaire est bien crée dans tempDB, mais elle est préfixée automatiquement par SQl server, afin d’être différenciée des autres tables temporaires du même nom créées par d'autres sessions.

Donc effectivement, même si votre table #Temp_PFDV_FACT existe, la table tempdb..#Temp_PFDV_FACT, elle, n'existe pas

Avez vous essayé directement OBECT_ID('#Temp_PFDV_FACT') ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 15h45   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
ou en utilisant :
IF EXISTS(SELECT * FROM tempdb.sys.tables WHERE NAME='#Temp_PFDV_FACT')
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h08   #7
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Citation:
Envoyé par aieeeuuuuu Voir le message
Bonjour

Votre table temporaire est bien crée dans tempDB, mais elle est préfixée automatiquement par SQl server, afin d’être différenciée des autres tables temporaires du même nom créées par d'autres sessions.
Pas préfixé... Suffixé par un n° de session.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h24   #8
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Allez aieeeuuuuu tu nous feras dix pompes pour la peine :-)
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h01   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par SQLpro Voir le message
Pas préfixé... Suffixé par un n° de session.
Citation:
Envoyé par iberserk Voir le message
Allez aieeeuuuuu tu nous feras dix pompes pour la peine :-)
heu... 10 pompes... tu t'exprimes en binaire j’espère ! J'vais y laisser un biceps...

Et pis, c'est pas ma faute, mon SQL Server est en version hebraique
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h46   #10
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
C'est ça... et les tables systèmes elles ont des données en chinois ???
;-)

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h59   #11
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par SQLpro Voir le message
C'est ça... et les tables systèmes elles ont des données en chinois ???
;-)

A +
oui, les tables système, c'est vrai que parfois, pour moi c'est du chinois
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 07h28   #12
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
et à part ca ça marche? :-)
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 03h16   #13
Membre du Club
 
Inscription : mars 2002
Messages : 52
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 52
Points : 58
Points : 58
Citation:
Envoyé par xavier81 Voir le message
rebonjour;


j'ai fait cette ligne de code au début de ma proc mais toujours j'ai le message d'erreur je ne sais pas peut etre j'ai mal codé:

IF OBJECT_ID('tempdb..#Temp_PFDV_FACT ') IS NOT NULL

DROP TABLE #Temp_PFDV_FACT
Bonjour,
votre syntaxe de suppression de table temporaire locale est correcte.
Code :
1
2
3
 
IF  object_id('tempdb..#temp_table') IS NOT NULL 
   DROP TABLE #temp_table
Cependant, si vous faites le ménage au démarrage de procédure cela est inutile. Lorsque votre procédure se termine, les tables temporaires crées sont supprimées automatiquement.
Cela peut vous guider sur la correction :
vous devez, forcément, tenter de créer plus d'une fois vos tables temporaire. regarder vos ordres de créations.

2 conseils :
- sachez qu'une procédure stocker peut se déboguer.
- il y a des alternatives aux tables temporaires. selon votre situation, l'usage à une variable de table pourrait vous satisfaire.

@+
zeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 09h15   #14
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Bonjour,

Dans tous les cas, rien ne justifie l'utilisation de tables temporaires ou de variables de type table à part une mauvaise conception de la base de données.

Les tables temporaires sont une simple duplication de données déjà existantes portées dans TempDB qui sert bien d'autres buts (jointures, tris, ...).
Le recalcul des statistiques de colonne sur une telle table se fait toutes les 6 modifications, et entraîne donc des recompilations, coûteuses en CPU ...

C'est encore pire avec les variables de type table pour lesquelles aucune statistique n'est maintenue. Le cardinal d'une telle table est à 1 alors qu'elle peut contenir bien plus de lignes, ce qui entraîne la génération de plans incorrects, et donc de lectures inutiles.

Dès lors, l'utilisation de telles tables peut être réservée à la récupération de résultats de procédures stockées système comme xp_fixeddrives, xp_filexist qui ne sont pas documentées, ou encore de résultats d'instructions DBCC ...
Notons que ces procédures stockées système peuvent être aisément remplacées par des procédures stockées d'assembly

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 14h19   #15
Membre du Club
 
Inscription : mars 2002
Messages : 52
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 52
Points : 58
Points : 58
Citation:
Envoyé par elsuket Voir le message
Bonjour,

Dans tous les cas, rien ne justifie l'utilisation de tables temporaires ou de variables de type table à part une mauvaise conception de la base de données....
@++

Bonjour,

Je suis d'accord sur un point : le recours à des variables de tables ou des tables temporaires sont à éviter dans certains cas.

Néanmoins, je vous avoue les solliciter très fréquemment, notamment, par la possibilité de traitement ensembliste qu'elles permettent.
Pour moi, si on parle de mal absolu, cela concerne surtout les curseurs.
un traitement ensembliste est toujours à préférer à des itérations contre performante.

Donc pour éviter justement de recourir aux curseurs, je sollicite souvent table temporaire, variable de table ou représentation XML.

En terme de performance, il n'y a pas photos.
Mais effectivement, ce n'est pas la panacée :
- impact sur les caches et les plan , problématique de l'indexation, etc ...

@+
zeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 06h33   #16
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 667
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : janvier 2005
Messages : 4 667
Points : 8 715
Points : 8 715
Citation:
Néanmoins, je vous avoue les solliciter très fréquemment, notamment, par la possibilité de traitement ensembliste qu'elles permettent.
C'est donc que votre base de données a été mal conçue

En ce qui concerne les curseurs, j'ai publié un petit billet ici.
Pour les tables temporaires et les variables de type TABLE, j'en ai publié un autre ici

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 01h42   #17
Membre du Club
 
Inscription : mars 2002
Messages : 52
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 52
Points : 58
Points : 58
Effectivement pour certaines bases, nous ne pouvons même pas parler de conception.
Un enfant de 3 ans aurait fait mieux [...] les yeux fermés

héhé ... je ne revendique pas la paternité de ces bases mal. Je fais avec l'historique [...] malheuresement.
zeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h48.


 
 
 
 
Partenaires

Hébergement Web