2009-09-04 6 views
1

J'ai cette déclaration du curseur:Select retourne 0 lignes dans un curseur et bon nombre de lignes dans la course manuelle

 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 

Les paramètres @UsuarioAct et @ZonaAct sont obtenus d'un autre curseur. Le paramètre @par_Fecha est un paramètre d'entrée pour une procédure stockée.

Si j'exécute la procédure stockée, je n'obtiens jamais une seule ligne dans ce curseur. N'entre jamais dans la boucle typique WHILE @@ FETCH_STATUS = 0.

J'essaie dans l'analyseur de requête de copier le code de sélection et de remplacer les paramètres par des valeurs et j'obtiens les lignes correctes.

Je suis en cela dans SQL Server 2008.

Pourquoi cela?

Merci à tous. .

EDIT:

Code de procédure stockée complète:

PROCÉDURE ALTER [dbo] [paCreTablaHojaDeCajaMA] @par_Fecha AS DATETIME AS BEGIN - SET NOCOUNT ON ajouté pour éviter les jeux de résultats supplémentaires de - interférant avec les instructions 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' 

FIN

+0

Etes-vous en mesure de fournir une plus grande partie du processus stocké, par exemple comment lire et fermer le curseur? –

Répondre

0

Je l'ai trouvé!

Si vous lisez la déclaration du curseur extérieur:

DECLARE CURSOR CursorMaestra POUR SELECT NumUsuario, ZonaAsignada, IdUnico DE TmpMaestraHojaDeCajaDiaria ORDER BY NumUsuario

L'ordre est NumUsuario, ZonaAsignada, IdUnico

Mais plus tard, dans le premier FETCH:

FETCH SUIVANT CursorMaestra INTO @ZonaAct, @UsuarioAct, @IdUnicoAct

J'ai modifié l'ordre, le bon est @UsuarioAct, @ZonaAct, @IdUnicoAct. Par conséquent, les données User (UsuarioAct) et Zone (ZonaAct) étaient erronées.

Merci à tous pour vos conseils.

0

Pouvez-vous essayer d'ajouter entre parenthèses pour une sélection, comme

DECLARE CursorArticulo CURSEUR POUR ( SELECT HstAt.IdArticulo, SUM (HstAt.Cantidad) Comme SumaCantidad, HstAt.Precio DE HstArticulosTickets hstAT INNER JOIN HstTickets HstT ON hstAT.IdTicket = hstT.IdTicket O h [email protected] ET [email protected] ET DATEDIFF (jour, @ par_Fecha, HstT.FechaHoraTicket) = 0 GROUP BY IdArticulo, Precio ORDER BY IdArticulo )

sont les variables @UsuarioAct et @ZonaAct se peuplé? Pouvez-vous essayer de remplacer le même avec celui que vous avez essayé dans une requête manuelle?

+0

Oui, les variables @UsuarioAct et @ZonaAct sont remplies avec les valeurs droites. Je vais essayer la parenthèse ... –

+0

Très curieux: Quand j'ajoute la parenthèse je reçois une "erreur de syntaxe près de ORDER", donc j'enlève l'ORDER BY IdArticulo, mais je reçois les mêmes 0 lignes. Dans le manuel il y a un ORDER BY et je n'ai pas d'erreur (repeate: avec les 4 lignes retournées). –

+0

Est-il possible de publier l'ensemble de la requête, y compris l'autre curseur qui génère @UsuarioAct et @ZonaAct? Il semble que vous essayez un curseur imbriqué et suivant est l'un des liens que je me réfère http://rpbouman.blogspot.com/2005/10/nesting-mysql-cursor-loops.html – Umesh

0

Les variables @UsuarioAct et @ZonaAct ont-elles été déclarées comme types de données corrects? Peut-être qu'une conversion implicite modifie subtilement la signification des données?

+0

Salut Kev: Je l'ai testé et tous les types sont corrects. Thnx. –

0

Puisque vous obtenez initialement @@ FETCH_STATUS = -1 sur le curseur interne, je conclurais que votre instruction SELECT ne renvoie aucune ligne. Vous ne mentionnez que vous obtenez des résultats lors de l'exécution de la requête, mais s'il vous plaît essayez ce qui suit: le contenu du premier bloc BEGIN ... END remplacer par le code suivant seulement et voir si vous obtenez des jeux de résultats:

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 

et vérifiez si vous obtenir des résultats. Si vous ne le faites pas, supprimez certains des filtres dans la clause WHERE ...

+0

J'aime votre façon d'indenter le code SQL. Puis-je le copier? –

+0

gratuit comme une bière ... tant que vous ne brisez pas les normes conding de votre équipe – van

Questions connexes