Une table temporaire dans SQL Server, comme son nom l'indique, est une table de base de données qui existe temporairement sur le serveur de base de données. Une table temporaire stocke un sous-ensemble de données d'une table normale pendant une certaine période de temps.
Les tables temporaires sont particulièrement utiles lorsque vous avez un grand nombre d'enregistrements dans une table et que vous devez interagir de manière répétée avec un petit sous-ensemble de ces enregistrements. Dans de tels cas, au lieu de filtrer les données encore et encore pour extraire le sous-ensemble, vous pouvez filtrer les données une fois et les stocker dans une table temporaire. Vous pouvez ensuite exécuter vos requêtes sur cette table temporaire. Les tables temporaires sont stockées dans "tempdb" qui est une base de données système. Voyons comment vous pouvez utiliser des données temporaires dans un scénario simple.
Préparation des données
Préparons d'abord quelques données factices. Nous utiliserons ces données pour créer des tables temporaires.
Exécutez le script suivant sur votre serveur de base de données.
CREATE DATABASE schooldb CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, age INT NOT NULL, total_score INT NOT NULL, ) INSERT INTO student VALUES (1, 'Jolly', 'Female', 20, 500), (2, 'Jon', 'Male', 22, 545), (3, 'Sara', 'Female', 25, 600), (4, 'Laura', 'Female', 18, 400), (5, 'Alan', 'Male', 20, 500), (6, 'Kate', 'Female', 22, 500), (7, 'Joseph', 'Male', 18, 643), (8, 'Mice', 'Male', 23, 543), (9, 'Wise', 'Male', 21, 499), (10, 'Elis', 'Female', 27, 400);
Le script SQL ci-dessus crée une base de données "schooldb". Dans cette base de données, une table appelée "étudiant" est créée et des données factices sont ajoutées à la table.
Créer une table temporaire
Il existe deux méthodes pour créer des tables temporaires.
Méthode 1
La façon la plus simple de créer une table temporaire consiste à utiliser une instruction INTO dans une requête SELECT. Créons une table temporaire contenant le nom, l'âge et le sexe de tous les enregistrements d'étudiants masculins de la table des étudiants.
USE schooldb; SELECT name, age, gender INTO #MaleStudents FROM student WHERE gender = 'Male'
Jetez un oeil à la requête ci-dessus. Ici, nous avons créé une table temporaire "#MaleStudents" qui stocke le nom, l'âge et le sexe de tous les enregistrements d'étudiants masculins de la table des étudiants. Pour définir une table temporaire, nous utilisons l'instruction INTO après l'instruction SELECT. Le nom d'une table temporaire doit commencer par un dièse (#).
Maintenant, pour voir où cette table existe ; allez dans "Explorateur d'objets -> Bases de données -> Bases de données système -> tempdb -> Tables temporaires". Vous verrez le nom de votre table temporaire avec l'identifiant. Jetez un oeil à la figure suivante :
Vous devez vous poser des questions sur le "000000000006" à la fin du nom de la table. Il s'agit d'un identifiant unique. Plusieurs connexions à la base de données peuvent créer des tables temporaires portant le même nom. Par conséquent, pour différencier les tables temporaires créées par différentes connexions, le serveur de base de données ajoute automatiquement cet identifiant unique à la fin.
Vous pouvez effectuer des opérations sur la table temporaire via la même connexion qui l'a créée. Par conséquent, dans la même fenêtre de requête qui a créé la table "#MaleStudents", exécutez la requête suivante.
SELECT * FROM #MaleStudents
Depuis, la table #MaleStudents contient le nom, l'âge et le sexe de tous les étudiants masculins. La requête ci-dessus récupérera les résultats suivants.
[identifiant de table=15 /]
Pour créer une nouvelle connexion, vous pouvez simplement ouvrir une nouvelle fenêtre de requête dans "SQL Server Management Studio". Maintenant, gardez la connexion précédente ouverte et créez une autre table "MaleStudents" en utilisant la méthode 2 dans une nouvelle fenêtre de requête (nouvelle connexion).
Méthode 2
La deuxième méthode est similaire à la création de tables normales. Jetez un oeil à la requête suivante. Là encore, nous allons créer la table temporaire #MaleStudents. N'oubliez pas que cette requête doit être exécutée par une nouvelle connexion.
USE schooldb; CREATE TABLE #MaleStudents ( name VARCHAR(50), age int, gender VARCHAR (50) ) INSERT INTO #MaleStudents SELECT name, age, gender FROM student WHERE gender = 'Male'
Maintenant, si vous exécutez la requête ci-dessus, vous devriez voir deux tables temporaires #MaleStudents avec des identifiants uniques différents dans tempdb. En effet, ces deux tables ont été créées par deux connexions différentes. Jetez un oeil à la capture d'écran suivante.
Tables temporaires globales
Il est pertinent de mentionner ici qu'une table temporaire n'est accessible qu'à la connexion qui a créé cette table temporaire. Il n'est pas accessible aux autres connexions. Cependant, nous pouvons créer des tables temporaires accessibles à toutes les connexions ouvertes. Ces tables temporaires sont appelées tables temporaires globales. Le nom de la table temporaire globale commence par un double symbole dièse (##). Créons une table temporaire globale contenant les enregistrements de toutes les étudiantes de la table des étudiants.
USE schooldb; SELECT name, age, gender INTO ##FemaleStudents FROM student WHERE gender = 'Female'
Maintenant, vous pouvez accéder à la table ##FemaleStudents à partir de n'importe quelle connexion ouverte.
Supprimer une table temporaire
Il existe deux façons de supprimer des tables temporaires dans SQL Server :la suppression automatique et la suppression manuelle.
Suppression automatique
Une table temporaire est automatiquement supprimée lorsque la connexion qui a créé la table est fermée. Alternativement, lorsque vous fermez la fenêtre de requête qui a créé la table temporaire, sans enregistrer les modifications, la table sera fermée. Si une connexion exécute des requêtes sur la table globale, ces requêtes doivent d'abord être terminées avant que la table globale ne soit supprimée.
Suppression manuelle de table
Vous pouvez supprimer manuellement une table sans fermer de connexion à l'aide de l'instruction DROP TABLE. Cependant, rappelez-vous que l'instruction doit être exécutée par la connexion qui a réellement créé la table. Examinez la requête suivante :
DROP TABLE #MaleStudents
Cela revient à supprimer une table normale.
Tables temporaires et procédures stockées
Nous avons appris précédemment qu'une table temporaire n'est accessible que localement à l'intérieur de la connexion qui l'a créée. Il existe une exception à cette règle. Lorsque vous créez des procédures stockées, vous pouvez également accéder à des tables temporaires dans d'autres connexions.
Créons deux procédures stockées en utilisant deux connexions différentes. La première procédure stockée insère des données dans la table #MaleStudents, tandis que la seconde sélectionne les données de la table.
Créez une nouvelle connexion. Si vous utilisez SQL Server Management Studio, vous pouvez le faire en ouvrant une nouvelle fenêtre de requête. Exécutez le script SQL suivant dans la nouvelle fenêtre de requête.
Create Procedure spInsertStudent (@Name Varchar(50), @Age int, @Gender Varchar(50)) As Begin Insert Into #MaleStudents Values (@Name, @Age, @Gender) End
Nous avons maintenant créé une procédure stockée qui insère un enregistrement dans la table temporaire #MaleStudent. Notez que cette connexion n'a pas créé le #MaleStudent, mais nous y accédons en y insérant un enregistrement. En effet, lors de la création d'une procédure stockée, vous pouvez accéder à des tables temporaires à partir d'une connexion autre que celle qui a créé la table. Si vous exécutez la requête ci-dessus, vous verrez que SQL Server ne générera aucune erreur.
De même, ouvrez une nouvelle connexion et créez-y la procédure stockée suivante :
CREATE PROCEDURE spListStudent AS BEGIN SELECT * FROM #MaleStudents ORDER BY name END
La procédure stockée ci-dessus sélectionne tous les enregistrements de la table temporaire #MaleStudents. Là encore, nous accédons à une table temporaire à l'intérieur d'une connexion qui n'a pas créé la table.
Maintenant, voici la partie délicate. Bien que vous puissiez accéder à une table temporaire à l'intérieur d'une autre connexion lors de la création d'une procédure stockée, vous ne pouvez pas accéder à une table temporaire lors de "l'exécution" d'une procédure stockée à l'intérieur d'une autre connexion. Pour exécuter une procédure stockée qui accède à une table temporaire, vous devez être à l'intérieur de la connexion qui a créé la table temporaire.
Par conséquent, exécutez les requêtes suivantes dans la connexion qui a créé la table #MaleStudents.
EXECUTE spInsertStudent Bradley, 45, Male Execute spListStudent
Ici, la première procédure stockée insère un nouvel enregistrement d'étudiant avec le nom :Bradley, age :45 et sexe :Homme dans la table #MaleStudents. La deuxième procédure stockée sélectionne tous les enregistrements de la table #MaleStudents dans l'ordre croissant des noms. La sortie des procédures stockées ci-dessus sera :
[identifiant de table=16 /]
Vous pouvez clairement voir notre enregistrement nouvellement inséré dans les enregistrements sélectionnés ci-dessus.
Voir aussi :
Performances des variables de table dans SQL Server
Présentation des expressions de table communes dans SQL Server