Dans SQL Server, les tables temporaires sont créées en utilisant le même CREATE TABLE
syntaxe sous forme de tables régulières. La différence est que les noms des tables temporaires sont précédés d'un ou deux signes dièse (#
), selon qu'il s'agit d'une table temporaire locale ou d'une table temporaire globale :
- Tables temporaires locales sont précédés d'un seul signe dièse (
#
) - Tables temporaires globales sont précédés d'un double signe dièse (
##
)
Exemple 1 - Créer une table temporaire locale
Voici un exemple de création d'une table temporaire locale :
CREATE TABLE #Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Le nom que vous spécifiez pour une table temporaire locale peut comporter au maximum 116 caractères. Les autres types de table peuvent comporter 128 caractères, mais les tables temporaires locales sont automatiquement ajoutées avec un suffixe numérique généré par le système.
Exemple 2 - Créer une table temporaire globale
Voici un exemple de création d'une table temporaire globale :
CREATE TABLE ##Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Les noms de tables temporaires globales peuvent comporter jusqu'à 128 caractères. SQL Server n'ajoute pas de suffixe numérique généré par le système aux tables temporaires globales comme il le fait pour les tables temporaires locales, vous pouvez donc utiliser tout l'espace.
Exemple 3 - Afficher les tables temporaires
Je peux exécuter la requête suivante pour voir mes tables temporaires nouvellement créées.
SELECT name FROM tempdb.sys.tables WHERE name LIKE '#Cats%' OR name = '##Cats';
Résultat :
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | +----------------------------------------------------------------------------------------------------------------------------------+
Nous pouvons voir que la table temporaire locale a été ajoutée au suffixe numérique généré par le système, et c'est pourquoi ma requête utilise le LIKE
opérateur pour cette table.
Exemple 4 – Nouvelle session
Si j'ouvre une nouvelle session, crée une table temporaire locale avec le même nom (Cats), puis relance cette requête, j'obtiens ceci :
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | +----------------------------------------------------------------------------------------------------------------------------------+
Ainsi, plusieurs sessions peuvent créer une table locale du même nom car SQL Server modifie ce nom en incrémentant le suffixe.
Exemple 5 – Même session
Cependant, si j'essaie de recréer la table temporaire locale dans le même session, j'obtiens ceci :
Msg 2714, Level 16, State 6, Line 1 There is already an object named '#Cats' in the database.
Et si j'ouvre encore une autre session, je réussis, et quand j'interroge tempdb.sys.tables
J'obtiens ceci :
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | | #Cats_______________________________________________________________________________________________________________00000000001B | +----------------------------------------------------------------------------------------------------------------------------------+