选择返回行的光标,右数0行手动运行
我有这个游标声明:选择返回行的光标,右数0行手动运行
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 [email protected]
AND [email protected]
AND DATEDIFF(day,@par_Fecha,HstT.FechaHoraTicket)=0
GROUP BY IdArticulo, Precio
ORDER BY IdArticulo
@UsuarioAct和@ZonaAct从另一个光标获得的参数。 @par_Fecha参数是存储过程的输入参数。
如果我运行存储过程,在这个游标中,我从来没有得到一个单一的行。永远不要进入典型的WHILE @@ FETCH_STATUS = 0循环。
我尝试在查询分析器复制选择代码并用值替换参数,我得到正确的行。
我在SQL Server 2008中运行这个。
为什么会发生这种情况?
谢谢大家。 。
编辑:
全部存储的过程代码:
ALTER PROCEDURE [DBO] [paCreTablaHojaDeCajaMA] @par_Fecha AS DATETIME AS BEGIN - 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 [email protected]
AND [email protected]
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
我找到了!
如果你读外游标声明:
DECLARE CursorMaestra CURSOR FOR SELECT NumUsuario,ZonaAsignada,IdUnico FROM TmpMaestraHojaDeCajaDiaria ORDER BY NumUsuario
的顺序是NumUsuario,ZonaAsignada,IdUnico
但后来,在第一个FETCH中:
FETCH NEXT FROM CursorMaestra INTO @ZonaAct,@UsuarioAct,@IdUnicoAct
我改变了顺序,正确的是@UsuarioAct,@ZonaAct,@IdUnicoAct。
因此,User(UsuarioAct)和Zone(ZonaAct)数据是错误的。
谢谢大家的提示。
你可以尝试添加括号的选择像
DECLARE CursorArticulo CURSOR FOR ( SELECT HstAt.IdArticulo,SUM(HstAt.Cantidad)作为SumaCantidad,HstAt.Precio FROM HstArticulosTickets hstAT INNER JOIN HstTickets HstT ON hstAT.IdTicket = hstT.IdTetet WHERE [email protected] AND [email protected] 和DATEDIFF(日,@ par_Fecha,HstT.FechaHoraTicket)= 0 GROUP BY IdArticulo,PRECIO ORDER BY IdArticulo )
是变量@UsuarioAct和@ZonaAct得到填充?你可以尝试用手动查询尝试替换那个吗?
是的,变量@UsuarioAct和@ZonaAct正在使用rigth值填充。 我将尝试括号... – 2009-09-04 10:28:16
非常好奇:当我添加括号时,我得到一个“ORDER附近的语法错误”,所以我脱掉了ORDER BY IdArticulo,但我得到了相同的0行。在手动运行中有一个ORDER BY,我没有得到任何错误(重复:正确的4个返回行)。 – 2009-09-04 10:35:11
是否可以发布整个查询,包括生成@UsuarioAct和@ZonaAct的其他游标? 看起来你正在尝试一个嵌套游标,并且以下是我参考的链接之一http://rpbouman.blogspot.com/2005/10/nesting-mysql-cursor-loops.html – Umesh 2009-09-04 11:03:20
是否已将变量@UsuarioAct和@ZonaAct声明为正确的数据类型?
也许隐式转换会微妙地改变数据的含义?
嗨Kev:我测试过了,所有类型都正确。日Thnx。 – 2009-09-04 12:01:45
由于您最初在内部游标上获得@@ 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 [email protected]
AND [email protected]
AND DATEDIFF(day,@par_Fecha,HstT.FechaHoraTicket)=0
GROUP BY IdArticulo, Precio
,并检查是否得到任何结果。如果你不这样做,那么删除WHERE子句中的一些过滤器......
我喜欢你缩进SQL代码的方式。我可以复制它吗? – 2009-09-04 16:07:51
免费作为啤酒...只要你不打破你的团队的conding标准 – van 2009-09-04 16:14:05
您能否提供更多的存储过程 - 例如,您如何读取和关闭光标? – 2009-09-04 11:00:56