Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Manejo de Cursor con Instruccion en cadena

Estas en el tema de Manejo de Cursor con Instruccion en cadena en el foro de SQL Server en Foros del Web. Hola, Estoy creando un Store Procedure en SQL Server 2000 y he llegado al punto en el cual necesito ejecutar las siguientes instrucciones: Set @Cadena ...
  #1 (permalink)  
Antiguo 04/10/2008, 12:45
 
Fecha de Ingreso: septiembre-2007
Mensajes: 51
Antigüedad: 17 años, 3 meses
Puntos: 0
Pregunta Manejo de Cursor con Instruccion en cadena

Hola, Estoy creando un Store Procedure en SQL Server 2000 y he llegado al punto en el cual necesito ejecutar las siguientes instrucciones:

Set @Cadena = 'Select count(Id_Proveedor),Id_Proveedor from _TmpProveedores'+@Unidad
Set @Cadena = @Cadena + ' Group By Id_Proveedor Having count(Id_Proveedor) > 1'
Declare @Rep_Cursor Cursor for
Exec Sp_ExecuteSql @Cadena
Open @Rep_Cursor
Fetch Next From @Rep_Cursor
While @@Fetch_Status = 0
Begin
Set @Cadena = 'Delete From _TmpProveedores'+@Unidad+ ' Where Color = ''Azul'' And Id_Provedor = '@Rep_Cursor
Exec Sp_ExecuteSql @Cadena
End
Close @Rep_Cursor;
Deallocate @Rep_Cursor;


Como el nombre de la tabla en la que hago el "Select" esta compuesto por ["Nombre Tabla"] + ["Unidad"] , Donde: "Unidad" es una variable que le paso como parametro al SP necesito crear una cadena con la sentencia completa y despues ejecutarla mediante SP_ExecuteSQL, pero al parecer no es permitido al momento de usuar cursores.
Alguien tiene una idea de como ejecutar esa Instruccion Select y poder almacenar el resultado en alguna variable para despues ejecutar la instruccion Delete que esta dentro del While

  #2 (permalink)  
Antiguo 05/10/2008, 08:01
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 20 años
Puntos: 38
Respuesta: Manejo de Cursor con Instruccion en cadena

Tendrias que incluir todo el codigo dentro de la sentencia exec para que funcione el cursor, ya que este se ejecuta en otro contexto.

Pero si vas a hacer esto, creo que se podria eliminar el cursor.. haciendo el delete con un join...algo como

Código:
Delete Tmp_Proveedores 
where color = 'Azul' and IdProveedor in (Select Id_Proveedor 
from _TmpProveedores
Group By Id_Proveedor Having count(Id_Proveedor) > 1)
Solo agregale la parte variable.


Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 02/06/2009, 12:56
 
Fecha de Ingreso: mayo-2009
Ubicación: Loreto, Zacatecas, México.
Mensajes: 10
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Manejo de Cursor con Instruccion en cadena

Como alguna vez me surgió el mismo problema y fue muy desagradable jejeje aquí les pongo mi código:

--Agregamos el select y from original
set @SQL_select = ' Select A.Clv_Factura,A.FACTURA,A.Fecha,A.periodoPagadoIni ,
A.periodoPagadoFin,a.statusAnt,A.imp_proporcional,
A.columnaEnReporte,A.importe,A.Serie,A.DescuentoNe t,A.Cancelada,a.cajera ,a.Cliente,a.sucursal,a.caja, a.Total_Puntos, c.Nombre, F.Nombre,X.Descripcion
From fACTURAS A
left outer join Sucursales C on C.Clv_Sucursal=A.sucursal left outer join Usuarios F on F.Clv_usuario=a.cajera left outer join CatalogoCajas X on X.Clave=A.Caja
Where (A.Fecha>=@FechaIni and A.Fecha<=@FechaFin) and A.Tipo=''C'' '
--Cargamos el filtro por cajera si es que estamos en logitel
set @SQL_Master = @SQL_select + @SQL_where_filtro
--Ejecutamos el cursor dentro del exec para realizar la consulta dinámica (soo de esa forma se logra conseguir...)
set @str_cursor =
'Declare Cursor_1 Cursor
Local Forward_Only Static Read_Only
For ' + @SQL_Master + ' Open Cursor_1
Fetch Next from Cursor_1
Into @Clv_Factura,@Factura,@Fecha,@periodoPagadoIni,@pe riodoPagadoFin,@statusAnt,@imp_proporcional,@colum naEnReporte,@fac_importe,@Serie,@DescuentoNet,@Can celada,@Cajera,@Contrato,@Sucursal,@Caja, @Total_Puntos, @Nombre_suc,@NomCajera,@NomCaja
'
--Ejecutamos el cursor con la consulta dinámica aplicando el Filtro
exec (@str_cursor)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:42.