【发布时间】:2010-11-25 14:06:53
【问题描述】:
我有这个游标声明:
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 中运行它。
为什么会这样?
谢谢大家。
编辑:
完整的存储过程代码:
改变程序 [dbo].[paCreTablaHojaDeCajaMA] @par_Fecha 作为日期时间 作为 开始 -- 添加了 SET NOCOUNT ON 以防止额外的结果集 -- 干扰 SELECT 语句。 设置无计数;
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'
结束
【问题讨论】:
-
您能否提供更多存储过程 - 例如,您如何读取和关闭光标?
标签: sql sql-server database select