Image n ° 1: je crée une procédure stockée pour insérer des enregistrements dans #t1. Dans la même session, j'exécute la procédure stockée Localtemp1 un nombre illimité de fois et cela fonctionne bien:

enter image description here

Image n ° 2: exécuter à nouveau la procédure stockée dans une autre session et fonctionne bien aussi:

enter image description here

Image # 3: création d'une procédure stockée pour l'insertion d'enregistrements dans ##tt. Pour la première exécution de la procédure stockée globaltemp1, cela fonctionne bien:

enter image description here

Image # 4: mais quand je l'ai exécuté une deuxième fois, il montre des erreurs (n'existe pas dans DB):

enter image description here

Image # 5: puis j'ai fermé la session où la procédure stockée globaltemp a été créée, et dans une nouvelle session, j'ai exécuté la procédure stockée, et cela fonctionne bien pour la première fois:

enter image description here

Image # 6: mais quand je l'exécute une deuxième fois, encore une fois, il affiche des erreurs (n'existe pas dans DB):

enter image description here

Ce que je sais, c'est la portée de la température locale et de la température globale, mais dans les procédures stockées, elles étaient complètement différentes

Quelqu'un peut-il me dire

  1. L'exécution de la procédure stockée localtemp1 plusieurs fois donne une sortie, mais lors de l'exécution de globaltemp1 sp pour la première fois donne une sortie et la seconde fois entraîne une erreur

  2. Autant que je sache, après l'exécution de la table temporaire de procédure stockée est abandonnée. Alors pourquoi la procédure stockée locale temporaire 1 est-elle exécutée dans toutes les sessions et plusieurs fois?

  3. Pourquoi la procédure stockée globaltemp1 s'exécute une fois et pour la deuxième fois et affiche une erreur?

  4. Dernier, la procédure stockée Globaltemp affiche la sortie dans une autre session pour la première fois uniquement lorsque la session créée a été fermée

Je veux dire

  • 56 ----> globaltemp sp a été créé
  • 57 ----> pour obtenir o / p je dois fermer 56
  • 58 ----> pour obtenir o? P je dois fermer 57 (POURQUOI ???)

Je suis un débutant en SQL et s'il vous plaît, quelqu'un me fait comprendre parce que si je ne trouve pas de raison logique et correcte, je ne pourrais pas plonger dans un autre sujet.

3
Shivaay 15 nov. 2017 à 12:12

4 réponses

Meilleure réponse

Le concept de table temporaire est de conserver temporairement des enregistrements. C'est une sorte de tableau dans lequel vous pouvez stocker plusieurs enregistrements en utilisant la même variable.

Lorsque vous créez une table temporaire, elle est en fait créée dans tempdb du serveur correspondant. Même si vous le nommez simplement comme #temp, le nom sur lequel il a été créé sur tempdb aura des paramètres supplémentaires comme le nom de votre base de données à partir de laquelle la table a été créée et votre identifiant de session, etc.

Je viens de créer la table temporaire suivante dans ma base de données principale

enter image description here

Et c'est ainsi qu'il a été nommé dans le tempdb

enter image description here

Toujours, dans ma base de données, je peux y accéder en utilisant le nom #temp. Mais la limitation d'une telle table temporaire est qu'elle est locale et ne peut être consultée qu'à partir de cette session, donc si j'essaie d'accéder à ce #temp à partir de n'importe quelle autre fenêtre de requête (session) même sur la même base de données, je ne pourrai pas pour y accéder. C'est là que nous utilisons les tables temporaires globales. Donc, si j'ajoute un autre # au nom de la table, cela devient une table temporaire globale qui peut être consultée à travers les sessions. Il est toujours créé sur Tempdb mais comme ça

enter image description here

Chaque fois que vous fermez la fenêtre / session de requête, les tables temporaires locales et globales sont automatiquement supprimées.

Ainsi, dans le cas des procédures stockées, l'heure de début et de fin du SP est traitée comme une session. Ainsi, une fois l'exécution de sp terminée, toutes les tables temporaires créées à l'intérieur de ce sp sont supprimées. Vous ne pouvez donc pas utiliser une table temporaire créée par un SP dans un autre.

J'espère que cela t'aides

4
Jayasurya Satheesh 15 nov. 2017 à 09:27

Les tables temporaires locales ne sont visibles que dans la session en cours et les tables temporaires globales sont visibles par toutes les sessions. Les tables temporaires globales sont automatiquement supprimées lorsque la session qui a créé la table se termine et que toutes les autres tâches ont cessé de les référencer. L'association entre une tâche et une table n'est conservée que pour la durée de vie d'une seule instruction Transact-SQL. Cela signifie qu'une table temporaire globale est supprimée à la fin de la dernière instruction Transact-SQL qui référençait activement la table à la fin de la session de création.

1
ChiragMM 15 nov. 2017 à 09:20

Si vous devez absolument avoir une table temporaire globale disponible, votre meilleure solution serait de créer une table permanente, puis de supprimer la table à la fin de la procédure stockée. Vous pouvez vérifier son existence avant de le créer:

IF OBJECT_ID ('dbo.yourtablenamehere', 'U') N'EST PAS NULL DROP TABLE dbo.yourtablenamehere;

Les différences entre une table temporaire et une table permanente ne sont vraiment pas si différentes, surtout que la table temporaire est automatiquement supprimée. Si vous l'utilisez dans une application qui appelle cette procédure, il peut être préférable que l'application charge la table temporaire dans un tableau et effectue les comparaisons à votre place, car elle peut maintenir le tableau tout en exécutant et en réexécutant les procs stockés.

0
Clark Vera 24 avril 2018 à 23:32

Il y a une bonne raison d'écrire dans une table temporaire au lieu de créer une table puis de la supprimer ... droits d'accès. Si vous créez des tables destinées à être utilisées par des personnes qui disposent uniquement de privilèges de lecture seule, elles ne pourront pas créer la table.

0
Lobeon 29 juil. 2019 à 15:17
47303369