我有这个游标声明:
DECLARE CursorArticulo CURSOR FOR
SELECT HstAt.IdArticulo, SUM(HstAt.Cantidad) As SumaCantidad,
HstAt.Precio
FROM HstArticulosTickets hstAT INNER JOIN HstTickets HstT
ON hstAT.IdTicket=hstT.IdTicket
WHERE hstT.NumUsuarioEmisor=@UsuarioAct
AND HstT.NumZona=@ZonaAct
AND DATEDIFF(day,@par_Fecha,HstT.FechaHoraTicket)=0
GROUP BY IdArticulo, Precio
ORDER BY IdArticulo
参数@UsuarioAct和@ZonaAct是从另一个Cursor获得的。 @par_Fecha参数是存储过程的输入参数。
如果我运行存储过程,在这个游标中我永远不会得到一行。永远不要进入典型的WHILE @@ FETCH_STATUS = 0循环。
我尝试在查询分析器中复制选择代码并用值替换参数,然后得到正确的行。
我在SQL Server 2008中运行它。
为什么会这样?
谢谢大家。
编辑:
完整存储过程代码:
ALTER PROCEDURE [dbo]。[paCreTablaHojaDeCajaMA] @par_Fecha AS DATETIME 如 开始 - 添加SET NOCOUNT ON以防止出现额外的结果集 - 干扰SELECT语句。 SET NOCOUNT ON;
DELETE FROM dbo.TmpDetalleHojaDeCajaDiaria
DELETE FROM dbo.TmpMaestraHojaDeCajaDiaria
INSERT INTO TmpMaestraHojaDeCajaDiaria
(NumUsuario, ZonaAsignada, TipoUsuario, NumPDA, ImporteUsuarioZona)
SELECT
hstZA.NumUsuario, hstZA.NumZonaAsignada,
(SELECT TipoUsuario FROM Usuarios U WHERE U.NumUsuario=hstZA.NumUsuario) AS TipoUsuario,
(SELECT NumPDA FROM Usuarios U WHERE U.NumUsuario=hstZA.NumUsuario) AS NumPDA,
(SELECT SUM(hstT.ImporteTotal) FROM HstTickets hstT
WHERE hstT.NumUsuarioEmisor=hstZA.NumUsuario
AND hstT.NumZona=hstZA.NumZonaAsignada
AND DATEDIFF(day,hstZA.Fecha,HstT.FechaHoraTicket)=0) AS ImporteUsuarioZona
FROM hstZonasAsignadas hstZA
WHERE DATEDIFF(day,hstZA.Fecha,@par_Fecha)=0
ORDER BY NumUsuario
DECLARE @UsuarioAct NCHAR(4)
DECLARE @ZonaAct SMALLINT
DECLARE @IdUnicoAct INTEGER
DECLARE @IdArticulo INTEGER
DECLARE @NombreArticulo NCHAR(50)
DECLARE @PrecioUd MONEY
DECLARE @SumaCantidad INTEGER
DECLARE CursorMaestra CURSOR FOR
SELECT NumUsuario, ZonaAsignada, IdUnico FROM TmpMaestraHojaDeCajaDiaria
ORDER BY NumUsuario
OPEN CursorMaestra
PRINT 'CURSOR ABIERTO'
-- Vamos a por el primero
FETCH NEXT FROM CursorMaestra INTO @ZonaAct, @UsuarioAct, @IdUnicoAct
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @ZonaAct
PRINT @UsuarioAct
DECLARE CursorArticulo CURSOR FOR
(SELECT HstAt.IdArticulo, SUM(HstAt.Cantidad) As SumaCantidad, HstAt.Precio
FROM HstArticulosTickets hstAT INNER JOIN HstTickets HstT
ON hstAT.IdTicket=hstT.IdTicket
WHERE hstT.NumUsuarioEmisor=@UsuarioAct
AND HstT.NumZona=@ZonaAct
AND DATEDIFF(day,@par_Fecha,HstT.FechaHoraTicket)=0
GROUP BY IdArticulo, Precio)
OPEN CursorArticulo
PRINT ' CURSOR ABIERTO'
-- Vamos a por el primero
FETCH NEXT FROM CursorArticulo INTO @IdArticulo, @SumaCantidad, @PrecioUd
PRINT @@FETCH_STATUS
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @NombreArticulo = NombreArticulo FROM Articulos
WHERE IdArticulo = @IdArticulo
PRINT @NombreArticulo
INSERT INTO TmpDetalleHojaDeCajaDiaria
(NumUsuario, ZonaAsignada, IdArticulo, NombreArticulo, PrecioUD, CantidadZonaUsuario, IdUnicoMaestra)
VALUES
(@UsuarioAct, @ZonaAct, @IdArticulo, @NombreArticulo, @PrecioUd, @SumaCantidad, @IdUnicoAct)
FETCH NEXT FROM CursorArticulo INTO @IdArticulo, @SumaCantidad, @PrecioUd
END
CLOSE CursorArticulo
DEALLOCATE CursorArticulo
PRINT ' CURSOR CERRADO'
FETCH NEXT FROM CursorMaestra INTO @ZonaAct, @UsuarioAct, @IdUnicoAct
END
CLOSE CursorMaestra
DEALLOCATE CursorMaestra
PRINT 'CURSOR CERRADO'
END
答案 0 :(得分:0)
您可以尝试为选择
添加括号DECLARE CursorArticulo CURSOR FOR ( SELECT HstAt.IdArticulo,SUM(HstAt.Cantidad)As SumaCantidad,HstAt.Precio 来自HstArticulosTickets hstAT INNER JOIN HstTickets HstT ON hstAT.IdTicket = hstT.IdTicket 在哪里hstT.NumUsuarioEmisor=@UuarioAct 和HstT.NumZona=@ZonaAct AND DATEDIFF(day,@ par_Fecha,HstT.FechaHoraTicket)= 0 GROUP BY IdArticulo,Precio 订购IdArticulo )
变量@UsuarioAct和@ZonaAct是否已填充?您尝试在手动查询时尝试将其替换为一个吗?
答案 1 :(得分:0)
是否已将变量@UsuarioAct和@ZonaAct声明为正确的数据类型?
隐式转换可能会巧妙地改变数据的含义吗?
答案 2 :(得分:0)
由于最初在内部游标上得到@@ FETCH_STATUS = -1,我会得出结论,你的SELECT语句不返回任何行。您确实提到在执行查询时获得结果,但请尝试以下操作:第一个BEGIN ... END
块的内容仅替换为以下代码,并查看是否获得结果集:
SELECT HstAt.IdArticulo, SUM(HstAt.Cantidad) As SumaCantidad, HstAt.Precio
FROM HstArticulosTickets hstAT
INNER JOIN HstTickets HstT
ON hstAT.IdTicket=hstT.IdTicket
WHERE hstT.NumUsuarioEmisor=@UsuarioAct
AND HstT.NumZona=@ZonaAct
AND DATEDIFF(day,@par_Fecha,HstT.FechaHoraTicket)=0
GROUP BY IdArticulo, Precio
并检查您是否得到任何结果。如果不这样做,则删除WHERE子句中的一些过滤器...
答案 3 :(得分:0)
我找到了它!
如果您阅读了外部游标声明:
DECLARE CursorMaestra CURSOR FOR SELECT NumUsuario,ZonaAsignada,IdUnico来自TmpMaestraHojaDeCajaDiaria 订购NumUsuario
订单是NumUsuario,ZonaAsignada,IdUnico
但后来,在第一个FETCH中:
FETCH NEXT FROM CursorMaestra INTO @ZonaAct,@ UAarioAct,@ IducnicAct
我已经更改了订单,正确的是@UuarioAct,@ ZonaAct,@ IdonicoAct。
因此,用户(UsuarioAct)和区域(ZonaAct)数据错误。
谢谢大家的提示。