【发布时间】:2009-09-15 06:48:10
【问题描述】:
在 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)
但这确实是错误的,因为选择返回不止一行。
我对此感觉很糟糕,因为它应该对我来说很容易,但我找不到等效的查询。
有什么建议吗?
提前致谢。
【问题讨论】:
标签: sql sql-server tsql sql-server-2008