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 :

Creation de tables temporaires


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Creation de tables temporaires
    Bonjour

    Une nouvelle fois je suis confronté aux différences sybntaxiques entre MySql et MSSQL

    J'essaye de faire un select qui doit me creer une table temporaire

    En MySql je fais cela ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    drop table if exists t1;
    create temporary table t1  
    Select
    PersID,
    count(PersID) as cnt
    FROM Personnes_tbl 
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    group by PersID;
    Ca fait une heure que je me bat avec les Ms SQL et google pour trouver comment faire en MS SQL mais sans succes

    N.B. Accessoiremrent, je souhaite creer une table temporaire afin de Generer un count que je vais utiliser dans une jointure afin d'eviter un Group By téléscopique dans mon query principal !!

    Que ceux qui n'ont jamais essayés MySql jettent un oeil il y a beaucoup de choses qui sont vachement plus faciles qu'avec MS Sql que je découvre

  2. #2
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Que ceux qui n'ont jamais essayés MySql jettent un oeil il y a beaucoup de choses qui sont vachement plus faciles qu'avec MS Sql que je découvre
    Comme vous le dites il faut jeter un oeil.... et prendre le temps de lire la documentation que ce soit pour SQL Server ou MySql ......

    Avec SQL Server les tables temporaires sont précédés de # (table temporaire locale) ou de ## (table temporaire globale)
    Ensuite vous pouvez déclarer votre table temporaire soit avec une instruction DDL (CREATE TABLE #TEMP) soit à la volée

    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
     
    CREATE TABLE #TEMPORY_TABLE_1
    (
     PersID,
     countPersID INT
    );
    GO
     
    INSERT INTO #TEMPORY_TABLE_1
    SELECT
    PersID,
    count(PersID) 
    FROM Personnes_tbl 
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    GROUP BY PersID;
     
    SELECT * FROM #TEMPORY_TABLE_1;
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT
    PersID,
    count(PersID) AS cnt
    INTO #TEMPORY_TABLE_1
    FROM Personnes_tbl 
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    GROUP BY PersID;
     
    SELECT * FROM #TEMPORY_TABLE_1;
    Selon la version de SQL Server s'ajoutent d'autres possibilités comme les CTE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH CTE
    AS
    (
     SELECT
     PersID,
     count(PersID) 
     FROM Personnes_tbl 
     INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
     GROUP BY PersID;
    )
    SELECT * FROM CTE;
    ou enfin les variables de table

    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
    DECLARE @t TABLE
    (
     PersID,
     countPersID INT
    );
     
    INSERT INTO @t
    SELECT
     PersID,
     count(PersID) 
    FROM Personnes_tbl 
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    GROUP BY PersID;
     
    SELECT * FROM @t;
    Comme vous le voyez , vous avez un large panel de solutions pouvant répondre à vos besoins avec SQL Server.

    ++

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Merci
    Merci beaucoup pour ces explication et soit certain que je cours partout pour trouver l'information utile

    Voici ma derniere tentative sans succes

    L'idee c'est de creer une table temporaire (en l'effacant au préalable si elle existe deja)
    Dans cette table je stocke un count que je vais utiliser dans un autre select
    Le passage par la table temporaire me permet de ne pas construire un group by demesuré obligatoire en MS Sql et tout a fait inutile en MySQL

    Quand j'execute la commande ci-apres il me dit que #t1 existe déja ?

    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
    IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '#t1') DROP TABLE #t1;
    SELECT 
    PersID,
    count(PersID) as cnt
    into #t1
    FROM Personnes_tbl 
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    group by PersID;
    SELECT 
    #t1.PersID AS PersID,
    #t1.cnt,
    PersNom AS Nom,
    PersPrenom AS Prenom,
    PersSexID AS Sex,
    PaysNomFR AS Nationalite,
    PersGSM AS Mobile,
    PersTel AS Tel,
    PersEmail AS Email
    FROM #t1,Personnes_tbl
    LEFT OUTER JOIN Pays_tbl ON PersNationID = PaysID 
    where #t1.PersID=Personnes_tbl.PersID;

  4. #4
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Bonjour,
    Sous Sql Server, à partir de la version 2005, vous avez les CTE (http://msdn.microsoft.com/fr-fr/library/ms190766.aspx) qui peuvent notamment servir de table temporaire. Moi qui fait l'inverse et me dirige maintenant vers MySql je suis bien triste de ne pas voir cette même fonctionnalité.

    Cela fonctionne globalement de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    WITH TableTemporaire AS ( SELECT PersID, count(PersID) AS cnt
    FROM Personnes_tbl 
    INNER JOIN Link_Contacts_tbl ON PersID = CtacPersID 
    GROUP BY PersID )
     
    SELECT .... , ... , T2.cnt , ...
    FROM ... T1
    INNER JOIN TableTemporaire T2 ON T2.PersID = T1.PersID
    Vous pouvez utiliser les CTE dans des vues.
    En espérant vous avoir aidé.

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Tu a a peu pres la meme chose en MySql
     
    drop table if exists tempo1;
    Create temporary table tempo1
    Select
    ...
    From
    etc ...;
    Select * from tempo1;

  6. #6
    Membre expérimenté

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Par défaut
    Pas vraiment d'accord, on peut aussi créer des tables temporaires avec # sous Ms Sql, les CTE sont bien plus que cela car elles permettent également de mettre en place la récursivité. Je ne t'en dirais pas plus car je ne suis pas expert là dessus mais en gros cela revient à utiliser le résultat d'une requête sur elle même en boucle.
    En bref je crois que quand on change comme cela de base de données on a toujours des à priori au début car on doit s'adapter mais chaque outil a ses qualités et ses défauts.

    Bon courage

Discussions similaires

  1. Problème creation de table temporaire
    Par Smata dans le forum JDBC
    Réponses: 0
    Dernier message: 17/05/2015, 13h31
  2. [2008R2] Creation de Table temporaire
    Par xian21 dans le forum Développement
    Réponses: 5
    Dernier message: 25/10/2013, 10h06
  3. Creation table dans une procedure stockee - table temporaire
    Par dehorter olivier dans le forum SQL
    Réponses: 3
    Dernier message: 27/05/2007, 11h14
  4. [ASE]création de table temporaire
    Par Oraman dans le forum Sybase
    Réponses: 3
    Dernier message: 16/08/2006, 14h55
  5. [ASE 12.5.3][TSQL] - Creation d'une table temporaire en dynamique
    Par CVince dans le forum Adaptive Server Enterprise
    Réponses: 4
    Dernier message: 16/06/2006, 15h30

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