Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 05/01/2011, 10h42   #1
Futur Membre du Club
 
Inscription : mai 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 49
Points : 15
Points : 15
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
Jihane75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h19   #2
Membre régulier
 
Homme Christian Brossault
Administrateur de base de données
Inscription : avril 2006
Messages : 52
Détails du profil
Informations personnelles :
Nom : Homme Christian Brossault
Âge : 39
Localisation : France

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

Informations forums :
Inscription : avril 2006
Messages : 52
Points : 72
Points : 72
Bonjour,

Est-ce que vous pouvez dans une procédure faire votre update, comme :
Code :
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
Christianbt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 11h54   #3
Futur Membre du Club
 
Inscription : mai 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 49
Points : 15
Points : 15
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
Jihane75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 13h47   #4
Membre régulier
 
Homme Christian Brossault
Administrateur de base de données
Inscription : avril 2006
Messages : 52
Détails du profil
Informations personnelles :
Nom : Homme Christian Brossault
Âge : 39
Localisation : France

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

Informations forums :
Inscription : avril 2006
Messages : 52
Points : 72
Points : 72
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
Christianbt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 09h44   #5
Futur Membre du Club
 
Inscription : mai 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 49
Points : 15
Points : 15
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?
Jihane75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 11h26   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 15h47   #7
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 665
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 665
Points : 8 707
Points : 8 707
Bonjour,

La requête pourrait être :

Code :
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 :
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 :
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

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h28   #8
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

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

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Plus simple est de faire :

Code :
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 !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 15h00   #9
Futur Membre du Club
 
Inscription : mai 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 49
Points : 15
Points : 15
Merci à tous pour votre aide

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

merci
Jihane75 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h21.


 
 
 
 
Partenaires

Hébergement Web