SQL Server - ayuda sobre cursores

   
Vista:

ayuda sobre cursores

Publicado por hermes ophiel (3 intervenciones) el 11/12/2009 21:32:06
saludos

tengo los siguientes cursores los cuales si cumplen qon lo que yo quiero solo que se tardan demasiado me han dicho que con tablas temporales se pueden agilizar solo que no sabria como hacerlo no se si alguno de ustedes me puede ayudar a traducir el codigo a tablas temporales por favor les agradeceria mucho que me ayudaran ya que si es un poco urgente y ya le he dado muchas vueltas al asunto y no encuentro solucion.

ALTER PROCEDURE dbo.sp_rpg_concatenargestion
/*
(
@parameter1 int = 5,
@parameter2 datatype OUTPUT
)
*/
@fechainicial datetime,
@fechafinal datetime,
@producto varchar(100)
AS
create table #tmpTabla(center nvarchar(3000), cuenta nvarchar(50),gestiones nvarchar(3000), fecha nvarchar(3000), producto nvarchar(50))
declare @producto2 VARCHAR(50)
DECLARE @CUENTA char(20)
declare @fecha VARCHAR(3000)
declare @usuario VARCHAR(50)
declare @gestion VARCHAR(255)
declare @textofinal varchar(3000)
declare @textofinalusuario varchar(3000)
declare @textofinalfecha varchar(3000)
SET CONCAT_NULL_YIELDS_NULL OFF
DECLARE cursorcito CURSOR Fast_Forward FOR
select distinct gestion.cuenta from gestion(nolock) where (gestion.producto = @producto OR gestion.producto = @producto + ' ENTRADA' or gestion.producto = @producto + ' MANUAL') and gestion.fecha >= @fechainicial and gestion.fecha<= @fechafinal
for read only
OPEN cursorcito
FETCH NEXT FROM cursorcito INTO @CUENTA
WHILE @@FETCH_STATUS = 0
begin
-- DECLARE cursorcito2 CURSOR FORWARD_ONLY FOR
DECLARE cursorcito2 CURSOR Fast_Forward FOR

SELECT ltrim(rtrim(gestion.cve_user)),ltrim(rtrim(cast(convert(varchar(12), gestion.fecha, 103) as datetime))), ltrim(rtrim(cast(gestion.gestion as varchar(255)))),@producto FROM gestion(nolock) WHERE gestion.Cuenta = @CUENTA and (gestion.producto = @producto OR gestion.producto = @producto + ' ENTRADA' or gestion.producto = @producto + ' MANUAL') and gestion.fecha >= @fechainicial and gestion.fecha<= @fechafinal order by gestion.fecha desc
for read only
OPEN cursorcito2
FETCH NEXT FROM cursorcito2 INTO @usuario,@fecha, @gestion,@producto2
WHILE @@FETCH_STATUS = 0
BEGIN
--SET @TEXTOFINAL = @TEXTOFINAL + @fecha + @gestion
SET @TEXTOFINAL = @TEXTOFINAL + @gestion + '| '
SET @textofinalusuario = @textofinalusuario + @usuario + '| '
SET @textofinalfecha = @textofinalfecha + @fecha + '| '



FETCH NEXT FROM cursorcito2 INTO @usuario,@fecha, @gestion,@producto2
-- INSERT INTO #TMPtABLA VALUES (@TEXTOFINAL, @cuenta)
END
CLOSE cursorcito2
DEALLOCATE cursorcito2


FETCH NEXT FROM cursorcito INTO @CUENTA
INSERT INTO #TMPtABLA VALUES (@textofinalusuario,@cuenta,@TEXTOFINAL,@textofinalfecha, @producto2)
set @TEXTOFINAL = ''
set @textofinalusuario = ''
set @textofinalfecha = ''
END
CLOSE cursorcito
DEALLOCATE cursorcito

SELECT * FROM #TMPTABLA

/* SET NOCOUNT ON */
RETURN
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
Imágen de perfil de Isaias

RE:ayuda sobre cursores

Publicado por Isaias (3186 intervenciones) el 12/12/2009 00:43:41
Los cursores, son NO recomendados en SQL Server, mejor platicanos que deseas hacer y lo hacemos con T-SQL
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:ayuda sobre cursores

Publicado por hermes (3 intervenciones) el 12/12/2009 01:49:49
pues basicamente concatenar campos es decir si observas en el cursor lo que hago es concatenar todas las gestiones y algunos otros campos en base a una cuenta en comun

ejemplo:

cuenta gestion center
1 carro 34
2 camisa 5
1 computadora 78
3 casa 66
3 perro 89
4 telefono 34
5 botella 66
3 teclado 199
y al hacer la consulta me tiene que arrojar como resultado esto

cuenta gestiones centers
1 carro,computadora 34,78
2 camisa 5
3 casa,perro, teclado 66,89,199
4 telefono 34
5 botella 66

esto es un ejemplo pequeño pero la realidad es que son miles de registros
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
Imágen de perfil de Isaias

RE:ayuda sobre cursores

Publicado por Isaias (3186 intervenciones) el 14/12/2009 20:30:20
2005 y 2008, utilizar PIVOT
2000 e inferiores, es un poco mas complicado

¿Que version y edicion tienes?
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:ayuda sobre cursores

Publicado por hermes (3 intervenciones) el 15/12/2009 01:42:45
tengo sql 2000 de la edicion no te sabria decir
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
Imágen de perfil de Isaias

RE:ayuda sobre cursores

Publicado por Isaias (3186 intervenciones) el 15/12/2009 21:19:27
Para saber que edicion se tiene:

SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

Ejemplos de como hacer un PIVOT en 2000

http://www.maestrosdelweb.com/editorial/sqlserver2000/

http://www.webmagic.cl/rcrosstabsql.php
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:ayuda sobre cursores

Publicado por El Piro (11 intervenciones) el 14/12/2009 19:07:23
Hola y Saludos,

Primero que todo esto es lo que considero inapropiado, ojo, es mi punto de vista>

1) Utilizar funciones como TRIM y otras en el Select de cada uno de los cursores, esto quita montones de tiempo de procesamiento

2) Existe un cursor 2 dentro del 1, verifica la posibilidad de sacarlo de ahí. Para esto puedes meter en una temporal todo lo del Cursor1 y Cursor2 en otra y luego realizar un Select. Esto es un simple comentario de como podría ser porque, verificar una manera correcta de hacerlo porque inclusio podrías hacer JOIN sobre alguna información.

Como alternativas y soluciones:

1) Crea indices sobre los campos de consulta, esto te ayudará montones a reducir el tiempo.

2) Elimina las funciones como TRIM de la consulta del Cursor y si tienes que hacerlo que sea ya dentro de variables dentro del mismo cursor, no en el Select

3) Usa solamente los campos necesarios en el Select del cursor.

En verdad, mira como puedes sacar ese segundo cursor del primero, eso te ahorrara muchisimo tiempo.
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