2010-10-08 10 views

Répondre

5

trouvé une référence intéressante here:

tables temporaires globales fonctionnent comme des tables temporaires locales; ils sont créés dans tempdb et provoquent moins de verrouillage et de journalisation que les tables permanentes. Cependant, ils sont visibles pour toutes les sessions, jusqu'à ce que la session de création soit hors de portée (et la table ## temporaire globale n'est plus référencée par les autres sessions). Si deux sessions différentes essayez le code ci-dessus, si le premier est toujours actif, le second recevra les éléments suivants:

Serveur: Msg 2714, niveau 16, état 6, ligne 1 Il existe déjà un objet nommé ' ## people 'dans la base de données.

Je n'ai pas encore trouvé de justification valable pour l'utilisation d'une table ## temporaire globale. Si les données doivent persister à plusieurs utilisateurs, il est beaucoup plus logique, du moins pour moi, d'utiliser une table permanente. Vous pouvez rendre une table ## temporaire globale légèrement plus permanente en la créant dans une procédure de démarrage automatique, mais je ne vois toujours pas comment cela est avantageux par rapport à une table permanente. Avec une table permanente, vous pouvez refuser les autorisations. vous ne pouvez pas refuser les utilisateurs à partir d'une table ## temporaire globale.

+1

RE: "Je n'ai pas encore trouvé de justification valable pour l'utilisation d'une table ## temporaire globale" J'utilise des tables temporaires globales quand je veux être capable de créer une table en SQL dynamique et accédez-y dans la portée externe. En passant, cet article propage l'ancien mythe selon lequel les variables de table sont en mémoire et les tables #temp sur le disque. Il n'y a vraiment pas beaucoup (aucune?) Différence entre les deux à cet égard. –

+2

J'ai considéré ne pas inclure le 2ème paragraphe car il ne se rapportait pas à la question directement. Le premier paragraphe a discuté du problème exact décrit par Jeevan. –

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

Vous généralement obtenir cette erreur si vous faites une instruction create table qui serait évidemment l'échec comme « ## table » existe déjà dans la base de données.

Il me semble que peut-être à un certain point dans votre code, la logique CREATE TABLE pour cette table globale est invoquée à nouveau menant à cette erreur.

Avez-vous les détails de l'instruction exacte qui entraîne cette erreur?

2

Ainsi, la partie POURQUOI a répondu et voici comment le résoudre:

Faites une vérification pour voir si la table temporaire existe avant de le créer:

if object_id('tempdb..##table') is null begin 
     --create table ##table... 
    end 

Je trouve un joli Un commentaire intéressant sur la façon de vérifier l'existence d'une table temporaire de Googling http://sqlservercodebook.blogspot.com/2008/03/check-if-temporary-table-exists.html

+0

Est-ce thread-safe? Comment cela évite-t-il les conditions de concurrence lorsque d'autres sessions essaient de faire la même chose et quelque part après si elles créent cette table avant que la première session ne la crée? – alpav

+0

@alpav Cela n'évite pas les conditions de concurrence, donc si deux threads créent la table temporaire en même temps, l'un d'entre eux échouera. –

Questions connexes