web-dev-qa-db-fra.com

Différence entre #temptable et ## TempTable?

Pouvez-vous s'il vous plaît expliquer la différence entre #temptable et ##TempTable dans SQL Server. J'ai googlé à ce sujet mais je ne trouve aucune réponse.

S'il vous plaît aidez-moi à ce sujet

52
Vignesh Kumar A

`#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 pour tous les utilisateurs).'

12
Rahul

#TempTables ne sont pas seulement locaux pour l'utilisateur, ou connexion. Ils sont locaux par rapport au processus qui l'a créé et à tous les processus générés par le processus de création. Par exemple, j'ai les éléments suivants:

Declare @strDynamicSQL as varchar(8000)

Set @strDynamicSQL = 'Select GetDate() As TheDate Into #TheDateTable'
Execute(@strDynamicSQL)

Select *
From #TheDateTable

Je reçois l'erreur suivante:

Msg 208, niveau 16, état 0, ligne 7 Nom d'objet non valide '#TheDateTable'.

Mais si je le fais:

Declare @strDynamicSQL as varchar(8000)

Create Table #TheDateTable (
    TheDate     DateTime
)

Set @strDynamicSQL = 'Insert Into #TheDateTable Select GetDate() As TheDate'
Execute(@strDynamicSQL)

Select *
From #TheDateTable

Je ne reçois aucune erreur.

Dans le premier exemple, l'instruction Execute se produit dans un processus généré. Comme la table est créée dans ce processus lorsqu’elle renvoie, ce processus disparaît. Et avec le processus, la table est "bye-bye".

Dans le deuxième exemple, la table est créée par le processus de niveau supérieur. Il est ensuite interagi avec le processus engendré. La table est disponible pour traiter le processus dans lequel elle a été créée et tous les processus qu’elle génère.

##tables casser ceci. Le processus a ## La table créée est le processus de contrôle. La table ne sera pas marquée pour suppression si ce processus est toujours actif, même s'il n'y a pas de tâches associées à ce processus. Une fois que le processus dans lequel la table ## a été créée disparaît, la table est marquée pour être supprimée lorsque la dernière tâche est exécutée.

Un moyen simple de le voir est # Les tables sont uniquement disponibles dans l’étendue du processus dans lequel il a été créé. ## sont disponibles de la même manière que n'importe quelle autre table, sauf que l'existence existe et va avec le processus dans lequel elle a été créée.

10
Michael Cooper

Les tables temporaires locales ne sont visibles que pour leurs créateurs lors de la même connexion à une instance de SQL Server que lors de la création ou de la référence des tables. Les tables temporaires locales sont supprimées après que l'utilisateur s'est déconnecté de l'instance de SQL Server. Les tables temporaires globales sont visibles pour tous les utilisateurs et toutes les connexions après leur création. Elles sont supprimées lorsque tous les utilisateurs qui référencent la table se déconnectent de l'instance de SQL Server.

tiré d'ici

Plus sur ceci

7
SamuraiJack

moyen simple de tester #localtable and ##globaltable

Essayez ceci dans une autre fenêtre de requête SQL

create table ##globaltemptable (id int )
go
insert into ##globaltemptable values (1)
go
select * from ##globaltemptable

Essayez ceci dans une autre fenêtre de requête SQL

create table #localtemptable (id int )
go
insert into #localtemptable values (1)
go
select * from #localtemptable

Maintenant, si vous exécutez la requête select pour la table: #localtemptable dans la syntaxe de la fenêtre globale, vous obtiendrez une erreur comme suit: -

Invalid object name '#localtemptable'.

Pendant que vous exécutez la requête select pour la table: ## globaltemptable dans une fenêtre de requête de la même session, vous obtiendrez les résultats de la requête.

2
goofyui

La table sera visible/disponible jusqu'à la fin du processus/de la connexion qui l'a créée et uniquement pour la session qui l'a créée.

La table est globale et sera accessible à tous jusqu'à la fin du processus/de la session qui l'a créée.

0
agohil