Bonjour à tous.
J'ai une table Ordo_Recipe correspondant à cette structure :
- PK_IK (clé primaire)
- Time_Period (datetime)
- FK_ID_Resource (clé étrangère de ressource)
- Quantity (float)
- StopProduction (Bit)
Au sein d'une procédure stockée, je parcours la liste de mes ressources en base et je cumule les quantités dont le champ StopProduction est à 1 dans un intervalle de dates. La première date est fournie en paramètre de la procédure, la deuxième date correspond à la dernière fois où le champ StopProduction est à 0.
Voici l'extrait de code correspondant :
Comme ce code est au sein d'une grosse procédure qu'on m'a demandé d'optimiser, je souhaiterais le convertir en un "gros" SELECT, en évitant de passer par les curseurs... Malheureusement, je n'arrive pas à refaire cette requête car la requête imbriquée remontant le Time_Period dépend de la ressource en cours...
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
30
31
32 SET @CumulatedProduction = 0; DECLARE myCurrentResource CURSOR FOR SELECT DISTINCT FK_ID_Resource FROM Ordo_Recipe WHERE FK_ID_Ordo = @idToUpdate; OPEN myCurrentResource; FETCH myCurrentResource INTO @FK_ID_Resource; WHILE @@FETCH_STATUS = 0 BEGIN SELECT @CumulatedProduction += ISNULL(SUM(ISNULL(Quantity,0)),0) FROM Ordo JOIN Ordo_Recipe ON Ordo_Recipe.FK_ID_Ordo = Ordo.PK_ID AND Ordo_Recipe.FK_ID_Resource = @FK_ID_Resource WHERE FK_ID_Depository = @FK_ID_Depository AND FK_ID_Item = @FK_ID_Item AND StopProduction = 1 AND Time_Period < @Time_Period AND Time_Period > ( SELECT TOP 1 Time_Period FROM Ordo JOIN Ordo_Recipe ON Ordo_Recipe.FK_ID_Ordo = Ordo.PK_ID AND Ordo_Recipe.FK_ID_Resource = @FK_ID_Resource WHERE FK_ID_Depository = @FK_ID_Depository AND FK_ID_Item = @FK_ID_Item AND StopProduction = 0 AND Time_Period < @Time_Period ORDER BY Time_Period DESC ) FETCH myCurrentResource INTO @FK_ID_Resource; END CLOSE myCurrentResource; DEALLOCATE myCurrentResource;
Si vous avez des pistes, ça serait super !
Merci à vous.
Partager