В SQL 2008 у меня есть этот простой, но плохой сценарий sp, который работает:
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
Я знаю: я должен избегать курсоров, поэтому я почти уверен, что это можно сделать надлежащим образом.
Я пробовал с помощью одного запроса на обновление:
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)
Но это действительно неправильно, потому что выборка возвращает более одной строки.
Мне плохо с этим, потому что это должно быть легко для меня, но я не могу найти эквивалентный запрос.
Есть предложения?
Заранее спасибо.