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 :

Update d'une table suite à une fonction


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Points : 29
    Points
    29
    Par défaut Update d'une table suite à une fonction
    Bonjour à tous,

    J'ai une question sur la mise à jour des tables
    J'ai une table LISTE_COUT_REEL en BDD qui liste pour un projet la liste des coûts associés.
    Je dois mettre à jour une autre table COUT_REEL reprenant pour chaque projet le total des coûts

    Voici ce que j'ai dans la 1ère table :

    Projet Qté PU
    CD1 1 100
    CD1 15 45
    CD1 2 0.5
    CD2 20 5


    Dans la 2nd table pour le moment j'ai :
    Projet PR
    CD1
    CD2

    Le résultat attendu est
    Projet PR
    CD1 776
    CD2 100

    J'ai déjà créé une fonction me permettant de sortir un fichier agrégat à partir de ma table LISTE_COUT_REEL.

    Ma question est de savoir syntaxiquement, comment créer une procédure me permettant de mettre à jour ma table COUT_REEL à partir du résultat de la fonction.

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 69
    Points
    69
    Par défaut
    Bonjour,

    Est-ce que vous pouvez dans une procédure faire votre update, comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    update t2
    set PR = t1.qté * t1.PU
    from [1ere table] t1
    inner join [2nd table] t2
    on t1.Projet = t2.projet
    where ...
    et ensuite votre fonction sort votre fichier ?

    Christian

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Je ne sais pas si je me suis bien exprimée.

    En fait, je mon objectif n'est pas de sortir un fichier via une procédure mais de mettre à jour une table en BDD à partir d'une fonction

  4. #4
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 69
    Points
    69
    Par défaut
    Je vous proposais d'utiliser plutôt une procédure stockée pour faire votre update.
    Mais si vous devez impérativement utiliser une fonction, il existe les Table-valued-functions qui peuvent vous permettre de faire cela : http://msdn.microsoft.com/en-us/library/ms191165.aspx

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Ok, je n'avais pas bien compris.

    Donc en fait, je peux utiliser une procédure qui calcule mes agrégats et à la fin de ma procédure, au lieu de faire un select pour sortir mes résultats, je fais un update?

  6. #6
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    En fait vous pouvez même directement faire un UPDATE qui met a jour en même temps qu'il calcul le total des couts.

    Mais vous pouvez surement faire mieux :
    vous pouvez créer une vue pour remplacer votre 2eme table à partir de votre requete qui effectue les calculs. Vous pourrez ensuite indexer cette vue afin d'améliorer les performances.
    En faisant ainsi, vous n'aurez plus besoin de vous soucier de la mise a jour de votre deuxième table, elle sera faite automatiquement, en temps réel a chaque mise a jour de a première table.

    En l'occurrence, bien que n'ayant pas beaucoup d'info sur votre BDD, je pense qu'une vue serait beaucoup plus appropriée.

  7. #7
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    La requête pourrait être :

    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
    ;WITH
    	CTE AS
    	(
    		SELECT	Projet
    			, SUM(cout_reel) AS cout_reel_total
    		FROM	(
    				SELECT	Projet
    					, Qté * PU AS cout_reel
    				FROM	LISTE_COUT_REEL
    			) AS TMP
    		GROUP BY Projet
    	)
    UPDATE		dbo.COUT_REEL
    SET		PR = C.cout_reel_total
    FROM		CTE AS C
    INNER JOIN	dbo.LISTE_COUT_REEL AS LCR
    			ON LCR.Projet = C.Projet

    Cependant l'idée de la vue indexée est excellente, notamment parce que les vues indexées sont excellentes pour les calculs d'agrégats.
    Mais attention néanmoins à son coup de maintenance si la table subit de nombreuses modifications.

    Suivant vos besoins, vous n'aurez peut-être besoin que d'interroger la vue, sans avoir besoin de l'indexer. Il ne me semble pas nécessaire de conserver la table COUT_REEL.

    Voici donc pour la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE VIEW maVue
    AS
    SELECT	Projet
    	, SUM(cout_reel) AS cout_reel_total
    FROM	(
    		SELECT	Projet
    			, Qté * PU AS cout_reel
    		FROM	LISTE_COUT_REEL
    	) AS TMP
    GROUP BY Projet
    GO
    Et pour la vue indexée :

    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
    CREATE VIEW maVue
    WITH SCHEMABINDING
    AS
    SELECT	Projet
    	, SUM(cout_reel) AS cout_reel_total
    FROM	(
    		SELECT	Projet
    			, Qté * PU AS cout_reel
    		FROM	LISTE_COUT_REEL
    	) AS TMP
    GROUP BY Projet
    GO
     
    CREATE CLUSTERED INDEX IXC_maVue
    ON dbo.maVue (Projet)
    Avec la première vue, le calcul de l'agrégat est effectué au moment de l'exécution d'une requête spécifiant cette vue.
    Avec la seconde vue, comme l'a écrit aieeeuuuuu, le calcul est effectué en arrière plan par le moteur de bases de données

    @++

  8. #8
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Plus simple est de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    UPDATE		dbo.COUT_REEL
    SET		PR = R.Total
    FROM		( SELECT SUM(PU*QTE) AS Total
                                FROM LISTE_COUT_REEL
                                GROUP BY Projet
                             ) R1
    WHERE R1.Projet=COUT_REEL.Projet
    Bonne chance

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  9. #9
    Nouveau membre du Club
    Inscrit en
    Mai 2007
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 49
    Points : 29
    Points
    29
    Par défaut
    Merci à tous pour votre aide

    Je vais donc passer par une procédure stockées avec UPDATE intégré

    merci

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

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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