porque actualiza dos veces

03/03/2004 - 13:45 por edu | Informe spam
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON Pedidos.npedido Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND (Pedidos_Control.Anulado = 0)
AND (Pedidos.CodHilo IS NOT NULL) AND (Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel FROM Pedidos INNER
JOIN Pedidos_Control ON Pedidos.npedido =Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE npedidocontrol=@npedido
END

CLOSE marcada_cursor

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
03/03/2004 - 14:29 | Informe spam
Porque usas cursores?


Salu2
Maxi
Buenos Aires Argentina
Desarrollador Microsoft 3 Estrellas .NET
[Maxi_accotto[arroba]speedy[punto]com[punto]ar
MSN:


"edu" escribió en el mensaje
news:c24jka$jv0$
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON Pedidos.npedido > Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND (Pedidos_Control.Anulado 0)
AND (Pedidos.CodHilo IS NOT NULL) AND (Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel FROM Pedidos INNER
JOIN Pedidos_Control ON Pedidos.npedido =Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE npedidocontrol=@npedido
END

CLOSE marcada_cursor







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.593 / Virus Database: 376 - Release Date: 21/02/2004
Respuesta Responder a este mensaje
#2 ulises
03/03/2004 - 14:52 | Informe spam
Sí pasa dos veces debe ser porque tiene dos registros que
procesar :) ... sin data no te podría ser de mucha ayuda,
pero en todo caso lo que tratas de hacer se puede hacer
perfectamente sin un cursor, p.e. con :

UPDATE pedidos_control SET marcada=1
WHERE npedido
NOT IN (SELECT Pedidos_Control.Excel
FROM Pedidos INNER
JOIN Pedidos_Control
ON Pedidos.npedido =Pedidos_Control.npedidoControl
WHERE npedido
IN ( SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control
ON Pedidos.npedido = Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0)
AND (Pedidos_Control.Anulado = 0)
AND (Pedidos.CodHilo IS NOT NULL)
AND (Pedidos_Control.Marcada = 0) )

claro que conociendo la estructura y sobre todo que es lo
que se desea hacer, esto se podria mejorar.

Saludos,
Ulises

el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el


cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON


Pedidos.npedido >Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND


(Pedidos_Control.Anulado = 0)
AND (Pedidos.CodHilo IS NOT NULL) AND


(Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel


FROM Pedidos INNER
JOIN Pedidos_Control ON Pedidos.npedido


=Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE


npedidocontrol=@npedido
END

CLOSE marcada_cursor


.

Respuesta Responder a este mensaje
#3 Javier Loria
03/03/2004 - 16:13 | Informe spam
Hola:
A parte de recomedarte que revises bien la respuesta de ULISES. la razon
por la que actualiza 2 veces es que hay un error de logica en el cursor, el
cliclo debe escribirse:
==þTCH NEXT FROM marcada_cursor
INTO @npedido
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Excel=(SELECT Pedidos_Control.Excel
FROM Pedidos
INNER JOIN Pedidos_Control
ON Pedidos.npedido=Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control
SET marcada=1
WHERE npedidocontrol=@npedido
FETCH NEXT FROM marcada_cursor
INTO @npedido
END
Si no la ultima vez cuando no se puede leer el registro igual corres el
proceso.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

edu escribio:
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON Pedidos.npedido > Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND
(Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS NOT NULL) AND
(Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel FROM Pedidos
INNER JOIN Pedidos_Control ON Pedidos.npedido
=Pedidos_Control.npedidoControl WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE npedidocontrol=@npedido
END

CLOSE marcada_cursor
Respuesta Responder a este mensaje
#4 ulises
03/03/2004 - 16:25 | Informe spam
Tienes razón!, no me había fijado que el FETCH se
encuentra al inicio y no antes del bucle y al final de la
iteración lo que es lo lógico para que no haya problemas
de duplicidad :(.

Saludos,
Ulises

Hola:
A parte de recomedarte que revises bien la respuesta


de ULISES. la razon
por la que actualiza 2 veces es que hay un error de


logica en el cursor, el
cliclo debe escribirse:
FETCH NEXT FROM marcada_cursor


INTO @npedido
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Excel=(SELECT Pedidos_Control.Excel
FROM Pedidos
INNER JOIN Pedidos_Control
ON Pedidos.npedido=Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control
SET marcada=1
WHERE npedidocontrol=@npedido
FETCH NEXT FROM marcada_cursor
INTO @npedido
END
Si no la ultima vez cuando no se puede leer el registro




igual corres el
proceso.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

edu escribio:
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el




cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON




Pedidos.npedido >> Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND
(Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS




NOT NULL) AND
(Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel




FROM Pedidos
INNER JOIN Pedidos_Control ON Pedidos.npedido
=Pedidos_Control.npedidoControl WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE




npedidocontrol=@npedido
END

CLOSE marcada_cursor




.

Respuesta Responder a este mensaje
#5 eduardo
03/03/2004 - 21:26 | Informe spam
la razon por la que uso cursores es porque tengo un disparador asociado a la
tabla que uso, y la primera sentencia del disparador es que cuando se
actualice un dato de un campo, ese dato se inserta en una variable.
he tenido problemas con el update maximo, asi que lo he echo con un
disparador, nose si habeis tenido vosotros ese mismo problema.
gracias por vuestro interes

"ulises" escribió en el mensaje
news:619701c40133$d01c1e00$
Tienes razón!, no me había fijado que el FETCH se
encuentra al inicio y no antes del bucle y al final de la
iteración lo que es lo lógico para que no haya problemas
de duplicidad :(.

Saludos,
Ulises

Hola:
A parte de recomedarte que revises bien la respuesta


de ULISES. la razon
por la que actualiza 2 veces es que hay un error de


logica en el cursor, el
cliclo debe escribirse:
FETCH NEXT FROM marcada_cursor


INTO @npedido
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Excel=(SELECT Pedidos_Control.Excel
FROM Pedidos
INNER JOIN Pedidos_Control
ON Pedidos.npedido=Pedidos_Control.npedidoControl
WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control
SET marcada=1
WHERE npedidocontrol=@npedido
FETCH NEXT FROM marcada_cursor
INTO @npedido
END
Si no la ultima vez cuando no se puede leer el registro




igual corres el
proceso.
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

edu escribio:
el cursor devuelve solo un registro
porque el siguiente procedimiento pasa dos veces por el




cursor?

DECLARE @npedido AS INT
DECLARE @Excel AS BIT

DECLARE marcada_cursor CURSOR FOR
SELECT Pedidos.npedido
FROM Pedidos INNER JOIN Pedidos_Control ON




Pedidos.npedido >> Pedidos_Control.npedidoControl
WHERE (Pedidos_Control.Expedido = 0) AND
(Pedidos_Control.Anulado = 0) AND (Pedidos.CodHilo IS




NOT NULL) AND
(Pedidos_Control.Marcada = 0)

OPEN marcada_cursor

WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM marcada_cursor
INTO @npedido
SET @Excel=(SELECT Pedidos_Control.Excel




FROM Pedidos
INNER JOIN Pedidos_Control ON Pedidos.npedido
=Pedidos_Control.npedidoControl WHERE npedido=@npedido)
IF @Excel=0
UPDATE pedidos_control SET marcada=1 WHERE




npedidocontrol=@npedido
END

CLOSE marcada_cursor




.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida