选择返回行的光标,右数0行手动运行

选择返回行的光标,右数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

+0

您能否提供更多的存储过程 - 例如,您如何读取和关闭光标? – 2009-09-04 11:00:56

我找到了!

如果你读外游标声明:

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得到填充?你可以尝试用手动查询尝试替换那个吗?

+0

是的,变量@UsuarioAct和@ZonaAct正在使用rigth值填充。 我将尝试括号... – 2009-09-04 10:28:16

+0

非常好奇:当我添加括号时,我得到一个“ORDER附近的语法错误”,所以我脱掉了ORDER BY IdArticulo,但我得到了相同的0行。在手动运行中有一个ORDER BY,我没有得到任何错误(重复:正确的4个返回行)。 – 2009-09-04 10:35:11

+0

是否可以发布整个查询,包括生成@UsuarioAct和@ZonaAct的其他游标? 看起来你正在尝试一个嵌套游标,并且以下是我参考的链接之一http://rpbouman.blogspot.com/2005/10/nesting-mysql-cursor-loops.html – Umesh 2009-09-04 11:03:20

是否已将变量@UsuarioAct和@ZonaAct声明为正确的数据类型?

也许隐式转换会微妙地改变数据的含义?

+0

嗨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子句中的一些过滤器......

+0

我喜欢你缩进SQL代码的方式。我可以复制它吗? – 2009-09-04 16:07:51

+0

免费作为啤酒...只要你不打破你的团队的conding标准 – van 2009-09-04 16:14:05