Aller au contenu principal
Notification
ITPro
  • Ressources IT
  • Newsletter
Se connecter
S’inscrire
  • Cloud & Infrastructure
  • Cybersécurité
  • Data & IA
  • Workplace et Endpoints
Se connecter
S’inscrire
  • Facebook
  • X
  • Linkedin
  • Instagram

Inscrivez-vous

Newsletter iTPro

  • Cloud & Infrastructure
  • Cybersécurité
  • Data & IA
  • Workplace et Endpoints
  • Cloud & Infrastructure
  • Cybersécurité
  • Data & IA
  • Workplace et Endpoints
  1. Accueil
  2. Data & IA
  3. #Table or @Table ?

Sommaire

Tech stories

  • Tech Stories

    Les compétences cloud à développer dans une équipe IT

  • Tech Stories

    Sous-titres vidéo : formats SRT, VTT et bonnes pratiques

Data & IA

#Table or @Table ?

Par

Olivier Maître
Date
3 février 2014
Temps de lecture
4 minutes

Je viens aborder aujourd’hui un sujet qui a souvent donné lieu à des débats enflammés : quelles sont les différences entre les variables de type table (@table), et les tables temporaires (#table) ? Lesquelles faut-il utiliser ? Que devons nous préconiser ?

Sommaire

Depuis qu’elles sont apparus, j’ai très souvent entendu dire que les variables de types tables étaient « meilleures » que les tables temporaires parce qu’elles seraient « en mémoire uniquement » et ne généreraient pas d’IO : c’est absolument faux. A l’inverse, certaines personnes « Old school » (désolé ;)) ne jurent que par les tables temporaires sous prétexte qu’elles offrent plus de souplesse et de possibilités dans leurs usages, et que par conséquent, elles offriront systématiquement de meilleures performances. C’est également faux.

Alors #Table or @Table ?

Je ne prendrai pas directement part au débat dans cet article, pour conclure sur l’une ou l’autre, mais je vais exposer les possibilités offertes par les deux méthodes et comparer leurs performances.

Les possibilités

Commençons par un petit rappel sur les possibilités de chacune.

Les tables temporaires

Une table temporaire va agir en tout point comme une table classique. En cela, elle va supporter toutes les instructions DDL ou DML valable sur les tables classiques. Il sera dès
lors possible (entre autre) :

  • De modifier sa définition pour ajouter, supprimer ou modifier une colonne.
  • D’ajouter des contraintes (check, foreign key, valeur par défaut etc.).
  • D’ajouter des index (cluster et non cluster).
  • Et très important comme vous le verrez plus bas dans cet article, le moteur de base de données va maintenir des statistiques de distribution, tout en nous laissant la possibilité d’en créer manuellement.

Les variables de type table

Une variable de type table est gérée par le moteur comme une variable classique et non pas comme un objet. Elle sera donc plus restrictive dans ces possibilités, permettant néanmoins :

  • De créer une clé primaire, contrainte unique ou nulle.
  • De créer un index cluster.
  • D’être utilisée dans une fonction de type table.
  • En revanche, le moteur ne maintiendra aucune statistique de distribution sur une variable de type table, et il nous sera impossible d’en créer.

La portée

Une table temporaire sera visible dans la session de l’utilisateur qui la crée. Première conséquence : plusieurs utilisateurs pourront donc simultanément créer la même table temporaire dans leurs sessions respectives, avec exactement le même nom, sans problème. Pour pouvoir gérer plusieurs objets portant le même nom, le moteur va ajouter un identifiant unique rattaché à la session au nom interne de la table temporaire. Pour l’utilisateur, le nom de la table temporaire sera donc limité à 116 caractères ‘seulement’, contre 128 pour les tables classiques (ce qui ne devrait pas être trop restrictif, n’est-ce-pas ?).

Deuxième conséquence : dans la mesure où la table temporaire est visible dans la session, il sera tout à fait possible de l’utiliser au travers de procédures stockées imbriquées. La table temporaire créée dans une procédure stockée pourra être adressée dans toutes les procédures appelées par celle-ci.

Enfin, il sera également possible d’utiliser les syntaxes INSERT / EXEC et SELECT INTO pour créer la table temporaire, comme on le ferait pour une table classique.

À noter qu’il est possible de créer des tables temporaires de portées globales, visibles depuis toutes les sessions connectées, en préfixant le nom de la table par un double # au moment de sa création. Dans ce cas, une seule table de ce nom pourra être créée à un instant donné.

Les variables de type tables quant à elles ne sont visibles que dans le contexte de la transaction dans laquelle elles sont créées, et je parle là de transactions internes au moteur et non pas de transactions utilisateurs, comme nous le verrons plus loin. Cela implique qu’il sera impossible de les utiliser dans des procédures stockées imbriquées et d’utiliser les syntaxes INSERT / EXEC ou SELECT INTO @Table.

En revanche, à l’inverse d’une table temporaire, une variable de type table peut être utilisée dans une fonction de type table (TVF : Table Valuable Function).

La fonction suivante sera acceptée sans problème par le moteur :

CREATE FUNCTION dbo.F_VariableTable ()
RETURNS INT
AS

BEGIN
DECLARE @VariableTable TABLE (col1 INT)
DECLARE @max INT
INSERT @ VariableTable VALUES (1)
SELECT @max = MAX(col1) FROM @VariableTable
RETURN @max
END
GO

En revanche si l’on tente :

CREATE FUNCTION dbo. F_TemporaryTable ()
RETURNS INT
AS
BEGIN
CREATE TABLE #TemporaryTable (col1 INT)
DECLARE @max INT
INSERT #TemporaryTable VALUES (1)
SELECT @max = MAX(col1) FROM #TemporaryTable
RETURN @max
END
GO

On obtiendra alors :

Server: Msg 2772, Level 16, State 1, Procedure example2,
Line 7
Cannot access temporary tables from within a function.

Nous avons bien déblayé le terrain en termes de capacité de l’une ou l’autre, et nous avons maintenant une meilleure idée du contexte dans lequel nous les utiliserons. Nous allons continuer notre étude en comparant maintenant les performances des deux possibilités.

Tech Stories

Les compétences cloud à développer dans une équipe IT

Pour beaucoup de DSI, le cloud a longtemps été réduit à un projet de migration : déplacer des serveurs on-premise vers un fournisseur externe. Une fois cette étape franchie, la…

Lire l'article : Les compétences cloud à développer dans une équipe IT

Ressource IT

SIEM & PME : Comment construire la boîte noire de votre SI ?

Passez à la cybersécurité proactive, transformez la collecte et l’analyse des logs en un bouclier dynamique contre les cybermenaces. Découvrez comment mettre en place une approche SIEM modulaire, évolutive et…

Découvrir la ressource : SIEM & PME : Comment construire la boîte noire de votre SI ?

Inscrivez-vous

Newsletter iTPro

Olivier Maître

Rédigé par Olivier Maître

Olivier Maître est un professionnel IT et rédacteur sur iTPro.fr : Administrateur de base de données

Tous ses articles →

Data & IA

À lire également...

  • IA nouveau mandat exécutif de gouvernance
    Data & IA

    L’IA est devenue un mandat exécutif. Le plus difficile commence maintenant.

    Par

    Sabine Terrey
    Date
    2 novembre 2026
    Temps de lecture
    5 minutes
  • Agents IA Pilotage DSI Risques et Mesures
    Data & IA

    Agents IA : les DSI perdent le contrôle d’une flotte qu’ils ne savent plus piloter

    Par

    Sabine Terrey
    Date
    2 novembre 2026
    Temps de lecture
    4 minutes
  • Pannes Informatiques - comment faire face affronter le danger éviter les pertes
    Data & IA

    Pannes IT : 48 millions d’euros perdus chaque année par les entreprises françaises

    Par

    Sabine Terrey
    Date
    30 octobre 2026
    Temps de lecture
    3 minutes
  • Informatique quantique - Future de la confiance numérique
    Data & IA

    Informatique quantique : sommes-nous prêts à reconstruire la confiance numérique ?

    Par

    Sabine Terrey
    Date
    29 octobre 2026
    Temps de lecture
    5 minutes
ITPro
  • X
  • Linkedin
  • Facebook
  • Instagram
Se connecter
S’inscrire
  • Cloud & Infrastructure
  • Cybersécurité
  • Data & IA
  • Workplace et Endpoints
  • Ressources IT
  • Espace responsable sécurité
  • Espace DSI
  • Espace Architecte IT
  • Espace IT Manager
  • Espace Responsable Data / IA

Inscrivez-vous

Newsletter iTPro

© iTPro.fr

  • Comité éditorial
  • Régie médias
  • Mentions-légales
  • Gestion et protection des données personnelles
  • Gestion des cookies
ITPro
Gérer le consentement aux cookies
Pour offrir les meilleures expériences, nous utilisons des technologies telles que les cookies pour stocker et/ou accéder aux informations des appareils. Le fait de consentir à ces technologies nous permettra de traiter des données telles que le comportement de navigation ou les ID uniques sur ce site. Le fait de ne pas consentir ou de retirer son consentement peut avoir un effet négatif sur certaines caractéristiques et fonctions.
Fonctionnel Toujours activé
Le stockage ou l’accès technique est strictement nécessaire dans la finalité d’intérêt légitime de permettre l’utilisation d’un service spécifique explicitement demandé par l’abonné ou l’internaute, ou dans le seul but d’effectuer la transmission d’une communication sur un réseau de communications électroniques.
Préférences
Le stockage ou l’accès technique est nécessaire dans la finalité d’intérêt légitime de stocker des préférences qui ne sont pas demandées par l’abonné ou la personne utilisant le service.
Statistiques
Le stockage ou l’accès technique qui est utilisé exclusivement à des fins statistiques. Le stockage ou l’accès technique qui est utilisé exclusivement dans des finalités statistiques anonymes. En l’absence d’une assignation à comparaître, d’une conformité volontaire de la part de votre fournisseur d’accès à internet ou d’enregistrements supplémentaires provenant d’une tierce partie, les informations stockées ou extraites à cette seule fin ne peuvent généralement pas être utilisées pour vous identifier.
Marketing
Le stockage ou l’accès technique est nécessaire pour créer des profils d’internautes afin d’envoyer des publicités, ou pour suivre l’internaute sur un site web ou sur plusieurs sites web ayant des finalités marketing similaires.
  • Gérer les options
  • Gérer les services
  • Gérer {vendor_count} fournisseurs
  • En savoir plus sur ces finalités
Voir les préférences
  • {title}
  • {title}
  • {title}