SQL Server - Se puede trabajar sin cursores??

 
Vista:

Se puede trabajar sin cursores??

Publicado por martin (5 intervenciones) el 20/01/2006 00:16:14
bueno yo trabajo mucho con cursores por que trabajamos con mucho procesos y la idea del uso del cursor es para rrecorer uno auno los registros en un tabla... mi pregunta esta ahi.. como rrecorer uno a uno los registros desde un tabla.
se que el cursor consume memoria. pero no he encontrado una forma mejor..

gracias
martin.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:Se puede trabajar sin cursores??

Publicado por kdlc (57 intervenciones) el 20/01/2006 00:49:46
Sip ... Con Stored Procedures tambien se puede conseguir procesar Registro por Registro pero sin tanto uso de recurso como los cursores ...

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Se puede trabajar sin cursores??

Publicado por Liliana (151 intervenciones) el 20/01/2006 12:35:59
Hola,
Trabajar con SQL Server te desafía a cambiar la forma de pensar frente a tu información, ya que está pensado para manejar conjuntos de filas.
Tendrás que cambiar el "a CADA UNA de mis filas que cumplan xxx condiciones" por "a TODAS las filas que cumplan xxx condiciones".
Para ir a lo concreto, te ofrezco eliminar uno de tus cursores, si nos pasás información de prueba, diseño simplificado de las tablas, y resultado esperado.
Saludos,
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Se puede trabajar sin cursores??

Publicado por kdlc (57 intervenciones) el 20/01/2006 18:20:50
Suena bien, cuelga uno de tus cursores para transformarlo ... a ver que resulta
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Se puede trabajar sin cursores??

Publicado por MARTIN (1 intervención) el 20/01/2006 22:41:31
AQUI VA UNO DE LOS TANTOS QUE TENGO.....
el proces consiste en pasar datos de una base a otra (de AGENCIA A FINANC, EL DETALLE ES QUE CADA REGISTRO DE LA TABLA DEPOSITO DE LA BD AGENCIA , SE VA EVALUANDO PARA SABER DE QUE TIPO ES Y PODER HACER UN UPDATE A LA TABLA AHORRO DEL BASE DE DATOS FINANC.

ESTE ES UN EJEMLO ES SENCILLO., POR QUE EN OTROS CASO HAY QUE HACER CALCULOS Y/O OPERACIONES. .
QUEIRO VER QUE SE PUEDE HACER AHI..

CREATE PROCEDURE MIGRA_AHORRO_ACTUALIZA_RET
(@AGE CHAR(2))
AS
DECLARE @DEPOSITO_INT INT,@DEPOSITO_SEC NUMERIC
DECLARE @NRO INT,@NRO_FAM CHAR(2),@FECHA_NAC SMALLDATETIME
DECLARE @DEPOSITO_FEC CHAR(10),@DEPOSITO_TIP NUMERIC,@DEPOSITO_IMP NUMERIC(12,2)
---SE RRECORRE UNA BASE DA DATOS LLAMADA AGENCIA Y NECESITO PASAR REGISTRO POR REGISTRO DESDE LA TABLA DEPOSITO
---PARA HACER UN UPDATE.EN ESTE CASO.
DECLARE CURS_AH CURSOR FOR
SELECT DEPOSITO_CLA,DEPOSITO_MON,DEPOSITO_SEC,DEPOSITO_TIP,DEPOSITO_VTO,DEPOSITO_IMP FROM AGENCIA.DBO.DEPOSITO
WHERE DEPOSITO_IMP>0
OPEN CURS_AH
FETCH NEXT FROM CURS_AH
INTO @DEPOSITO_CLA,@DEPOSITO_MON,@DEPOSITO_SEC,@DEPOSITO_TIP,@DEPOSITO_VTO,@DEPOSITO_IMP
While @@fetch_status = 0
BEGIN
IF @DEPOSITO_MON=0 ---SI ES 0 ES MONEDA SOLES
SET @SUBTIPO_AHO='101' --POR TANTO ES DE TIPO 101
IF @DEPOSITO_MON=1 --SI ES 1 ES DOLARES
SET @SUBTIPO_AHO='201' --`POR TANTO ES DE TIPO 201
IF @DEPOSITO_cla=1 --
BEGIN
IF @DEPOSITO_SOC>0
SET @CUENTA=@COOPAC+ @AGE +(RIGHT('0000000'+ ltrim(cast (@DEPOSITO_SOC as char(6))),7))
SET @TIPO_AHO='02'
END
IF @DEPOSITO_cla=2
BEGIN
SET @TIPO_AHO='03'
IF @DEPOSITO_SOC>0
SET @CUENTA=@COOPAC+ @AGE +(RIGHT('0000000'+ ltrim(cast(@DEPOSITO_SOC as char(6))),7))
END
SET @CTA_AHO ='002'+ @AGE +(RIGHT('0000000'+ LTRIM(STR(@DEPOSITO_SEC)),7))
SET @SALDO_CONGE=@DEPOSITO_IMP
--------ACTUALIZA LOS SALDO CONGELADOS DE LOS AHORROS
UPDATE FINANC.DBO.AHORRO
SET SALDO_CONGE=@SALDO_CONGE
WHERE CTA_AHO=@CTA_AHO AND TIPO_AHO=@TIPO_AHO AND SUBTIPO_AHO=@SUBTIPO_AHO
------------------------------
FETCH NEXT FROM CURS_AH
INTO @DEPOSITO_CLA,@DEPOSITO_MON,@DEPOSITO_SEC,@DEPOSITO_TIP,@DEPOSITO_VTO,@DEPOSITO_IMP
END
Close CURS_AH
Deallocate CURS_AH

/*
DECLARE @AGE CHAR(2)
SET @AGE ='04'
EXEC MIGRA_AHORRO_ACTUALIZA_RET @AGE
/*

ESPERO QUE ESTE CLARO....
GRACIAS POR LA AYUDA.. AL MENOS LOQ UE QUIERO ES QUE ME DEN UNAS PAUTAS QUE CON ESO ME SERVIRA DE MUCHO EN EL FUTURO.

POR CIERTO EN LA TABLA ORIGEN HAY MAS DE 1000 REGISTROS

MARTIN Y.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Se puede trabajar sin cursores??

Publicado por kdlc (57 intervenciones) el 22/01/2006 01:41:40
Hola Martin,
Te dejo la "PAUTA" para que veas como podrias transformar tu cursor, tambien te adjunto el cursor basado en la misma seleccion para que compares. fijate en las Estadisticas y en el Trace para que te des una idea. falto la data para probar realmente que anda mejor. pero es fin de semana y tengo que salir por unas copas :D suerte!
PD: Ejecutalos contra la DB Northwind

+ CURSOR ---------------------------------------------------------------------------
declare @EmployeeID nchar(5)
declare @EmpName nchar(255)
declare @RowNum int
declare EmpList cursor for
select EmployeeID,rtrim(Firstname) + ' ' + Rtrim(LastName) from Northwind.dbo.Employees
OPEN EmpList
FETCH NEXT FROM EmpList
INTO @EmployeeID, @EmpName
set @RowNum = 0
WHILE @@FETCH_STATUS = 0
BEGIN
set @RowNum = @RowNum + 1
print cast(@EmployeeID as char(1)) + ' ' + @EmpName
FETCH NEXT FROM EmpList
INTO @EmployeeID, @EmpName
END
CLOSE EmpList
DEALLOCATE EmpList
+ FINAL CURSOR ------------------------------------------------------------------------

+ WHILE LOOP ----------------------------------------------------------------------------
SET NOCOUNT ON
DECLARE @NextEmpRowID int,
@CurrentEmpRowID int,
@EmpLoopControl int,
@EmpName nvarchar(255)

Set @EmpLoopControl = 1
SELECT @NextEmpRowID = MIN(EmployeeID) FROM Employees

SELECT @CurrentEmpRowID = EmployeeID, @EmpName = rtrim(FirstName) + ' ' + rtrim(LastName)
FROM Employees WHERE EmployeeID = @NextEmpRowID

WHILE @EmpLoopControl = 1
BEGIN
--bloque de proceso
print cast(@CurrentEmpRowID as char(1)) + ' ' + @EmpName

--fin bloque proceso

--reinicio siguiente - parte del loop
SELECT @NextEmpRowID = NULL
--siguiente id
SELECT @NextEmpRowID = MIN(EmployeeID)
FROM Employees
WHERE EmployeeID > @CurrentEmpRowID
--verificar si es valido
IF ISNULL(@NextEmpRowID,0) = 0
BEGIN
BREAK
END
--seleccionamos siguiente registro
SELECT @CurrentEmpRowID = EmployeeID,
@EmpName = rtrim(FirstName) + ' ' + rtrim(LastName)
FROM Employees
WHERE EmployeeID = @NextEmpRowID
END
RETURN
+ FINAL WHILE LOOP --------------------------------------------------------------------------
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Se puede trabajar sin cursores??

Publicado por martin (5 intervenciones) el 22/01/2006 21:26:59
hola kdlc!!. muy buena tu respuesta, esta interesante, bueno aunque el ejemplo que envie es el mas sencillo que uso. ..pero me parece que si lo puedo aplicar , para mis programas.
pensaba que al usar varios bucles. hacia lento el proceso , pero veo que no es asi..
Gracias amigo, me va a servir un monto este ejemplo como base. esto nesecitaba para quitarme esta duda que tenia.

PD. no tome mucho , el alcohol no es bueno para la salud ni el bolsillo jejeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Se puede trabajar sin cursores??

Publicado por Liliana (151 intervenciones) el 23/01/2006 13:57:41
Martín,
No encontré motivo para setear @CUENTA, al menos en el código que pasaste no volvés a usarlo.
Esto no da error de sintaxis, pero por supuesto, no puedo hacer la prueba del funcionamiento al no tener datos y resultado esperado.
Espero que te sirva de orientación para ver las posibilidades que te brinda el T-SQL. Si después de probarlo encontrás dificultades, volvemos a verlo.
Saludos,
Liliana.

CREATE PROCEDURE MIGRA_AHORRO_ACTUALIZA_RET
(@AGE CHAR(2))
AS
UPDATE FINANC.DBO.AHORRO
SET SALDO_CONGE = DEPOSITO_IMP
FROM AGENCIA.DBO.DEPOSITO
WHERE DEPOSITO_IMP > 0
AND CTA_AHO = '002'+ @AGE +(RIGHT('0000000'+ LTRIM(STR(DEPOSITO_SEC)),7))
AND DEPOSITO_cla IN(1, 2)
AND TIPO_AHO = CASE WHEN DEPOSITO_cla = 1 AND DEPOSITO_SOC > 0 THEN '02'
WHEN DEPOSITO_cla = 2 THEN '03'
END
AND DEPOSITO_MON IN(0, 1)
AND SUBTIPO_AHO = CASE WHEN DEPOSITO_MON = 0 THEN '101' ---SI ES 0 ES MONEDA SOLES
WHEN DEPOSITO_MON = 1 THEN '201' --SI ES 1 ES DOLARES
END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Se puede trabajar sin cursores??

Publicado por Martin (5 intervenciones) el 23/01/2006 20:44:12
Liliana:
No me habia percatado de ese SET @cuenta en realidad no deberia ir....

Bueno a la solucion que me has dado es muy practica y muy efectiva.
Gracias por la ayuda. con lo que me han brindado tu y kdlc , me van a servir mucho ; ya que con tu metodo puedo hacer un update y con el de kdlc un insert.

Todo es cuestion de aplicar bien , los conocimientos de acuerdo a las necesidades de un proceso.

Martin.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Se puede trabajar sin cursores??

Publicado por Liliana (151 intervenciones) el 24/01/2006 11:51:29
Hola Martín,
Fijate que con poco podés modificar mi código para transformarlo en INSERT.
La idea es que se vea que pueden eliminarse los cursores y los ciclos de la mayoría del trabajo que hacemos en una aplicación comercial.
Quedo a tu disposición si querés que veamos más código para transformarlo en beneficio del servidor, y tuyo también cuando empieces a escribir mucho menos.
Saludos,
Liliana.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar