选择在游标中返回0行,在手动运行中返回正确的行数

时间:2009-09-04 10:10:51

标签: sql sql-server database select

我有这个游标声明:

     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

4 个答案:

答案 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)数据错误。

谢谢大家的提示。