Tables SQL Server: quelle est la différence entre @, # et ##?

89

Dans SQL Server, quelle est la différence entre une table @, une table # et une table ##?

Craig Schwarze
la source

Réponses:

114

#table fait référence à une table temporaire locale (visible uniquement par l'utilisateur qui l'a créée).

##table fait référence à une table temporaire globale (visible par tous les utilisateurs).

@variableName fait référence à une variable qui peut contenir des valeurs en fonction de son type.

Arnkrishn
la source
29
Votre définition de #table n'est pas totalement correcte. Il ne se limite pas à l'utilisateur mais plutôt à la connexion. Si un utilisateur a plusieurs connexions, il ne sera visible que par la connexion qui a créé la #table en premier lieu.
Davin Studer
@DavinStuder a offert une clarification cruciale. La distinction entre une table visible par l'utilisateur et une table visible uniquement sur la connexion courante est très importante.
mirzmaster
@DavinStuder comment afficher plusieurs connexions pour l'utilisateur? la même chaîne de connexion?
Kiquenet
25

Jettes un coup d'oeil à

Adriaan Stander
la source
4
Je me rends compte que cela remonte à longtemps, mais comme il s'agit d'une réponse de lien uniquement (et que le premier lien est mort), pourrait-il être mis à jour avec les principaux points à retenir de chacun des liens?
Mike Guthrie
7

#et les ##tables sont des tables réelles représentées dans la base de données temporaire. Ces tables peuvent avoir des index et des statistiques, et peuvent être consultées à travers les sprocs dans une session (dans le cas d'une table temporaire globale, elle est disponible à travers les sessions).

La @table est une variable de table.

Pour en savoir plus: http://www.sqlteam.com/article/temporary-tables

pleurnicher
la source
4
Et la variable de table vivra également dans la base de données tempDB, si sa taille est trop grande pour être conservée en mémoire.
marc_s
6

Je me concentrerais sur les différences entre #table et @table. ## table est une table temporaire globale et pour mémoire, en plus de 10 ans d'utilisation de SQL Server, je n'ai pas encore rencontré de cas d'utilisation valide. Je suis sûr que certains existent mais la nature de l'objet le rend hautement inutilisable à mon humble avis.

La réponse à @whiner par @marc_s est absolument vraie: c'est un mythe répandu que les variables de table vivent toujours en mémoire. Il est en fait assez courant pour une variable de table d'aller sur le disque et de fonctionner comme une table temporaire.

Quoi qu'il en soit, je suggère de lire l'ensemble des différences en suivant les liens indiqués par @Astander. La plupart des différences impliquent des limitations sur ce que vous ne pouvez pas faire avec les variables @table.

Aaron Bertrand
la source
J'ai 5 procédures stockées distinctes qui effectuent différentes parties d'un calcul et produisent un seul résultat. Pour l'audit, je veux voir des valeurs intermédiaires, tout comme l'auditeur. J'ai ajusté mes procédures pour en vider certaines dans une table ## Temp afin que nous puissions les voir tous les deux mais elles ne sont pas conservées (elles ne sont nécessaires que pendant les audits). Il existe un cas d'utilisation valide pour vous (à mon humble avis!).
RyanfaeScotland
@Ryan pourquoi ## Table est-il valide alors que vous auriez pu utiliser dbo.Table? Je ne considère pas cela comme un cas d'utilisation valide lorsque tout ce que vous avez fait est de vous éviter de taper une instruction DROP.
Aaron Bertrand
4
Je ne veux pas donner à l'auditeur les autorisations DROP sur ma base de données. Je ne veux pas non plus avoir à revenir et à ranger après qu'il ait terminé. Avec une table temporaire, il peut exécuter la requête aussi souvent qu'il le souhaite et je sais que lorsqu'il a terminé, il ne laisse pas d'empreinte dans la base de données.
RyanfaeScotland
4
CREATE TABLE #t

Crée une table qui n'est visible que sur et pendant cette CONNEXION, le même utilisateur qui crée une autre connexion ne pourra pas voir la table #t de l'autre connexion.

CREATE TABLE ##t

Crée une table temporaire visible par les autres connexions. Mais la table est supprimée lorsque la connexion de création est terminée.

Markus
la source
SqlConnection.Open()avec la même chaîne de connexion est la même CONNEXION ?
Kiquenet
2
non, c'est une connexion à la même base de données, mais presque certainement pas la même connexion.
Markus
0

si vous avez besoin d'une table temporaire globale unique, créez la vôtre avec un préfixe / suffixe Uniqueidentifier et supprimez l'exécution de la publication si un if object_id (.... Le seul inconvénient est d'utiliser Dynamic sql et doit supprimer explicitement.

Schmed
la source