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

Développement SQL Server Discussion :

INSERT INTO SELECT avec affectation variable


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Par défaut INSERT INTO SELECT avec affectation variable
    Bonjour,
    Voilà tous les soirs j'ai une très grosse table que je vide et mets à jour avec les données de production.
    Ca prend un certains temps et j'essaie de mettre en place plusieurs optimisation en //

    Cependant le principe est le suivant
    1 - INSERT INTO TblToUpdate (...) SELECT (...) FROM TblSelect
    2 - Plusieurs UPDATE TblToUpdate SET Chps = ...

    La raison des plusiers requêtes UPDATE est que les champs sont calculés par CASE WHEN successive. Si je fais tout ça dans la même requête UPDATE je me retrouve avec une truc du genre SET Chps = CASE WHEN CASE WHEN CASE WHEN...Bref illisible et difficile à écrire sans faute.

    J'ai trouvé un truc sur Google que j'ai testé qui marche pas mal
    On peut faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE TblToUpdate SET @Chps1 = Chps1 = CASE WHEN ... END, Chps2 = @Chps1 + CASE WHEN ... END
    Je l'ai testé et ça ça marche bien.

    Du coup pour encore gagner du temps, je m'étais proposé de tout faire dans la requête INSERT INTO et j'ai essayé un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO TblToUpdate (Chp1, Chp2)
    SELECT @Chps1 = CASE WHEN ... END, @Chps2 = @Chps1 + CASE WHEN ... END FROM TblSelect
    Et là j'ai le message :
    Une instruction INSERT ne peut contenir d'instruction SELECT affectant des valeurs à une variable.
    J'en déduis que ce n'est pas possible dans une requête INSERT INTO.

    Du coup j'ai pensé à la clause WITH et les jeux nommées dans la requête

    Mais je ne suis pas sur de gagner en temps.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Oui, une série de CTE successives pourrait permettre de factoriser le code, en rendant la requete plus lisible, sans affecter les performances.

    Ce serait même plus propre que l'utilisation de variables.

    vous pourriez aussi imbriquer des fonctions, mais en fonction du contenu de vos CASE, ça pourrait impacter les performances.

    donc, la CTE me semble une bonne idée.

    N'hésitez pas a venir poster le résultat !

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2008
    Messages
    464
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Mars 2008
    Messages : 464
    Par défaut
    Oui j'ai testé avec les CTE et c'est très bien.
    J'avais un peu peur de plier le serveur car selon moi les requêtes WITH chargés le résultat en mémoire et comme j'avais des 10zaines de millions d'enrgt je m'attendais au pire. Mais non !!
    Les CTE sont un peu magique selon moi, je ne sais pas comment ça fonctionne mais les résultats sont là.

  4. #4
    Membre Expert
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Par défaut
    Tous les résultats sont toujours chargés en mémoire. Le moteur d'exécution de SQL Server ne travaille jamais directement sur des données sur le disque, il accède aux données dan le cache de données du serveur qui s'appelle le buffer.
    Le moteur d'optimisation essaie de faire du bon boulot avec ce que tu lui donnes comme requête. Le pire qui puisse t'arriver est de faire une requête trop lente. Essaie et vérifie les performances, et si ça ne passe pas, change la requête ...

  5. #5
    Membre expérimenté
    Avatar de Lyche
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2007
    Messages
    2 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 523
    Billets dans le blog
    4
    Par défaut
    Regarde du côté de la clause OUTPUT.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO maTable2
    SELECT *
    OUTPUT INSERTED.*
       INTO uneNouvelleTable
      FROM MaTable;

    Avec une nouvelle table ayant la structure des données que tu veux récupérer de ton INSERT.

    Derrière, tu peux retravailler les données de façon normal et tu évites la grosse quantité de paramètre qui peuvent rendre le code parfois un peu illisibles.
    Rejoignez la communauté du chat et partagez vos connaissances ou vos questions avec nous

    Mon Tutoriel pour apprendre les Agregations
    Consultez mon Blog SQL destiné aux débutants

    Pensez à FAQ SQL Server Ainsi qu'aux Cours et Tuto SQL Server

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/11/2014, 19h48
  2. INSERT INTO + addition avec variable
    Par trialrofr dans le forum ASP
    Réponses: 5
    Dernier message: 06/07/2009, 09h17
  3. Réponses: 2
    Dernier message: 22/08/2008, 12h10
  4. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 17h32
  5. Réponses: 2
    Dernier message: 14/05/2004, 14h32

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