105 votes

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

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

132voto

Andriyev Points 9238

#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.

39 votes

Votre définition de #table n'est pas totalement correcte. Elle n'est pas limitée à l'utilisateur mais plutôt à la connexion. Si un utilisateur a plusieurs connexions, il ne sera visible que pour la connexion qui a créé la #table en premier lieu.

1 votes

@DavinStuder a offert une clarification cruciale. La distinction entre une table visible par l'utilisateur et une table visible uniquement sur la connexion actuelle est très importante.

1 votes

@DavinStuder comment afficher plusieurs connexions pour un utilisateur ? la même chaîne de connexion ?

27voto

5 votes

Je me rends compte que cette réponse date d'il y a longtemps, mais comme il s'agit d'une réponse par lien uniquement (et que le premier lien est mort), pourrait-on la mettre à jour avec les principales conclusions de chacun des liens ?

7voto

whiner Points 84

# y ## 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 on peut y accéder à travers les sprocs d'une session (dans le cas d'une table temporaire globale, elle est disponible à travers les sessions).

L'@table est une variable de table.

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

4 votes

La variable de table sera également stockée dans la base de données tempDB si sa taille est trop importante pour être conservée en mémoire.

6voto

user1573670 Points 46
CREATE TABLE #t

Crée un tableau 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 abandonnée lorsque la connexion créatrice est terminée.

0 votes

SqlConnection.Open() avec le même chaîne de connexion est le même CONNEXION ?

2 votes

Non, il s'agit d'une connexion à la même base de données, mais certainement pas de la même connexion.

5voto

Aaron Bertrand Points 116343

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 valable. Je suis sûr que certains existent mais la nature de l'objet le rend hautement inutilisable IMHO.

La réponse de @marc_s à @whiner 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 qu'une variable de table aille sur le disque et fonctionne comme une table temporaire.

Quoi qu'il en soit, je vous suggère de vous renseigner sur 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.

0 votes

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 les valeurs intermédiaires et l'auditeur aussi. J'ai ajusté mes procédures pour en extraire certaines vers une table ## Temp afin que nous puissions tous les deux les voir, mais elles ne sont pas conservées (elles ne sont nécessaires que pendant les audits). Il y a un cas d'utilisation valable pour vous (IMHO !).

0 votes

@Ryan pourquoi ##Table est-il valide alors que vous auriez pu utiliser dbo.Table ? Je ne considère pas que c'est un cas d'utilisation valide quand tout ce que vous avez fait est de vous éviter de taper une déclaration DROP.

4 votes

Je ne veux pas donner à l'auditeur des droits DROP sur ma base de données. Je ne veux pas non plus avoir à revenir et à faire le ménage une fois qu'il a 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X