Dans SQL 2008, j'ai ce facile mais-bad-écriture sp qui fonctionne:Optimise pour la vitesse d'une simple procédure stockée
ALTER PROCEDURE [dbo].[paActualizaCapacidadesDeZonas]
AS
BEGIN
SET NOCOUNT ON;
DECLARE @IdArticulo AS INT
DECLARE @ZonaAct AS INT
DECLARE @Suma AS INT
UPDATE CapacidadesZonas SET Ocupado=0
DECLARE csrSumas CURSOR FOR
SELECT AT.IdArticulo, T.NumZona, SUM(AT.Cantidad)
FROM ArticulosTickets AT
INNER JOIN Tickets T ON AT.IdTicket = T.IdTicket
GROUP BY AT.IdArticulo, T.NumZona
OPEN csrSumas
FETCH NEXT FROM csrSumas INTO @IdArticulo, @ZonaAct, @Suma
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE CapacidadesZonas SET Ocupado = @Suma
WHERE NumZona = @ZonaAct AND IdArticulo = @IdArticulo
FETCH NEXT FROM csrSumas INTO @IdArticulo, @ZonaAct, @Suma
END
CLOSE csrSumas
DEALLOCATE csrSumas
END
Je sais: je dois éviter les curseurs, donc je suis assez sûr que cela peut être fait de façon très appropriée.
J'ai essayé avec une seule requête de mise à jour:
UPDATE CapacidadesZonas SET Ocupado =
(SELECT SUM(AT.Cantidad)
FROM ArticulosTickets AT
INNER JOIN Tickets T ON AT.IdTicket = T.IdTicket
GROUP BY AT.IdArticulo, T.NumZona)
Mais c'est vraiment mal, parce que les select renvoie plus d'une ligne.
Je me sens mal avec ceci, parce que c'est censé être facile pour moi, mais je ne peux pas trouver la requête équivalente.
Des suggestions?
Merci d'avance.
Justin: Tu es mon héros! Non seulement tu me donnes la meilleure réponse mais avec des références et des mises en garde possibles. La table va être petite en lignes (cent), et sera mise à jour avant d'apparaître sur l'interface, donc je pense qu'il n'y aura pas de problème de performance. Juste une petite note: dans le script, j'avais besoin de changer le "SUM (s.Cantidad)" pour un "s.Ocupado". –