IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Utilisation des variables table


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut Utilisation des variables table
    Bonjour,

    Base SqlServer 2000 et 2005, dans une procédure stockée, je souhaiterais (si possible) utiliser une variable table de la même façon qu'une table temporaire

    Voici mon code :

    SELECT CodeVehicule
    INTO #Temp1
    FROM VehVehicule
    --
    DECLARE @VehDerniereIntervention TABLE (sVehiculeCode VarChar(10), dDerniereInterventionVeh DateTime)
    --
    -- Derniere intervention des véhicule
    INSERT INTO @VehDerniereIntervention
    SELECT sVehiculeCode, Max(dInterventionVeh) As dDerniereInterventionVeh
    FROM VehIntervention
    INNER JOIN #Temp1 ON VehIntervention.sVehiculeCode = #Temp1.CodeVehicule
    GROUP BY sVehiculeCode
    --
    select * from @VehDerniereIntervention
    --
    -- Véhicule / Intervention -> dernier compteur pour le véhicule
    SELECT DISTINCT CodeVehicule, dDerniereInterventionVeh, iInterventionVehCompteur
    FROM VehIntervention
    INNER JOIN #Temp1 ON VehIntervention.sVehiculeCode = #Temp1.CodeVehicule
    INNER JOIN @VehDerniereIntervention ON VehIntervention.sVehiculeCode = @VehDerniereIntervention.sVehiculeCode
    AND VehIntervention.dInterventionVeh = @VehDerniereIntervention.dDerniereInterventionVeh
    ORDER BY CodeVehicule



    Le select de ma variable @VehDerniereIntervention fonctionne très bien, c'est dans le second select que cela se gâte. Le résultat est : "La variable '@VehDerniereIntervention' doit être déclarée."

    Est ce que cela signifie qu'une variable table ne peut être utilisée comme une table temporaire ? Il est impossible de faire autre chose que travailler sur les données de celle-ci et afficher le résultat ?

    Merci de vos réponse.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    La visibilité d'une variable est limitée à la portée de code. Cela signifie que lorsque vous sortez du code, la table sous forme de variable est détruite.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    Ok, mais un truc m'échappe tout de même (désolée !).
    Je sais que la portée de la variable table est très restreinte, mais en quoi suis-je plus "sortie du code" en voulant utiliser cette variable table dans une clause inner join qu'en faisant un simple select * from @maTable ?
    C'est ce point, cette différence, que je ne situe pas bien.

    Cela signifie que pour mon exemple, je suis obligée d'utiliser une table temporaire locale à la place de la variable table ?

    Merci.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Lorsque vous créez une table temporaire, celle-ci est accessible pour toute la durée de la session, jusqu'à ce que vous la supprimiez par un DROP TABLE, ou, si vous êtes sous SMSS, que vous fermiez l'onglet dans lequel vous exécutez la requête : SQL Server ferme alors la connexion que vous avez ouverte, et votre table temporaire est supprimée automatiquement.

    Quand vous utilisez une variable table, celle-ci, comme toute variable, n'a de vie que pour la durée de l'exécution de la requête.
    Comme vous avez du exécuter les deux requêtes dans deux lots distincts et non pas dans un seul, alors votre variable table n'existe plus lors de la seconde requête.
    Si vous exécutez les deux requêtes dans un seul lot, vous n'aurez pas d'erreur d'exécution.

    @++

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 7
    Par défaut
    Bonjour,

    Non j'exécute tout dans le même script, sinon effectivement aucun intéret de créer une variable table.
    je fais ça (enfin j'essaie !) dans une procédure stockée, l'analyseur de requete sql server2000 ou une nouvelle requête sql server 2005.

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    OK, j'ai compris.

    Vous devez en fait aliaser votre variable table pour que la jointure fonctionne.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    DECLARE @T1 TABLE
    (
    	ID TINYINT
    )
     
    DECLARE @T2 TABLE
    (
    	ID TINYINT
    )
     
    INSERT INTO @T1 VALUES (1)
    INSERT INTO @T1 VALUES (2)
    INSERT INTO @T1 VALUES (3)
    INSERT INTO @T1 VALUES (4)
    INSERT INTO @T1 VALUES (5)
     
    INSERT INTO @T2 VALUES (1)
    INSERT INTO @T2 VALUES (2)
    INSERT INTO @T2 VALUES (3)
     
    -- Cette requête ne fonctionne pas
    SELECT @T1.*, @T2.*
    FROM @T1
    JOIN @T2 ON @T2.ID = @T1.ID
     
    -- Celle-ci s'exécute
    SELECT T1.*, T2.*
    FROM @T1 AS T1
    JOIN @T2 AS T2 ON T2.ID = T1.ID
    @++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation des variables table
    Par AnabelP dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 30/10/2008, 10h17
  2. Utiliser des variables d'une BDD
    Par Ragnarok_1er dans le forum Access
    Réponses: 3
    Dernier message: 25/01/2006, 08h32
  3. utilisation des variables global dans tout le projet
    Par EYENGA Joël dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/01/2006, 10h55
  4. [MFC] utilisation des variables associées
    Par Grey dans le forum MFC
    Réponses: 2
    Dernier message: 18/11/2005, 14h00
  5. Utiliser des variables d'environnements
    Par Xam335 dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/08/2004, 14h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo