execute dentro de cursor y cursor dentro de stored proc

11/07/2004 - 16:23 por Raúl Dario Levis | Informe spam
Tengo que realizar un SP que contenga un cursor. Este cursor lo utilizo para
obtener los nombres de las tablas dentro de una base de datos (for select
name from datos..sysobjects where type='U'), a su vez el procedimiento me
tiene que devolver una tabla con el nombre de la tabla y la cantidad de
filas.
Yo probé de la siguiente manera y no me funciona:
Create proc REPORTE
as
begin
create table #temporal (nam varchar(50),filas int)
declare cursor_tabla insensitive cursor
for select name from datos..sysobjects where type='U'
open cursor_tabla
declare @cant_filas int,
@nom_tabla varchar(40)
fetch next from cursor_tabla into @nom_tabla
while @@fetch_status= 0
Begin
execute('Select @cant= count(*) from '+@nom_tabla) /* aquí
da el error que me dice que @cant no esta declarado*/
insert into #temporal values(@nom_tabla,@cant)
fetch next from cursor_tabla into @nom_tabla
end
close cursor_tabla
deallocate cursor_tabla
end
El problema es con el execute y la asignacion del @cant, si no lo puedo
hacer así trataré de alguna otra forma.
desde yá muchisimas gracias

Preguntas similare

Leer las respuestas

#1 Maximiliano D. A.
11/07/2004 - 18:54 | Informe spam
Hola, en el Exceute no seria asi?

execute('Select @cant_filas= count(*) from '+@nom_tabla)

Suerte


"Raúl Dario Levis" escribió en el mensaje
news:elm%
Tengo que realizar un SP que contenga un cursor. Este cursor lo utilizo


para
obtener los nombres de las tablas dentro de una base de datos (for select
name from datos..sysobjects where type='U'), a su vez el procedimiento me
tiene que devolver una tabla con el nombre de la tabla y la cantidad de
filas.
Yo probé de la siguiente manera y no me funciona:
Create proc REPORTE
as
begin
create table #temporal (nam varchar(50),filas int)
declare cursor_tabla insensitive cursor
for select name from datos..sysobjects where type='U'
open cursor_tabla
declare @cant_filas int,
@nom_tabla varchar(40)
fetch next from cursor_tabla into @nom_tabla
while @@fetch_status= 0
Begin
execute('Select @cant= count(*) from '+@nom_tabla) /* aquí
da el error que me dice que @cant no esta declarado*/
insert into #temporal values(@nom_tabla,@cant)
fetch next from cursor_tabla into @nom_tabla
end
close cursor_tabla
deallocate cursor_tabla
end
El problema es con el execute y la asignacion del @cant, si no lo puedo
hacer así trataré de alguna otra forma.
desde yá muchisimas gracias



Respuesta Responder a este mensaje
#2 Javier Loria
11/07/2004 - 18:59 | Informe spam
Hola Raul:
Veamos, un procedimiento almacenado que usa un CURSOR, sobre TABLAS DE
SISTEMA, para ejutar en SQLD INAMICO que llena una TABLA TEMPORAL.
Esto es una excelente ruta para una aplicacion: LENTA, POCO ESCALABLE,
INSEGURA, DIFICIL DE MANTENER Y DEPENDIENTE DE LA VERSION.
Si siempre quieres hacerlo debes cambiar el
= EXECUTE ('Select @cant= count(*) from '+@nom_tabla)
=Por:
= EXEC sp_executesql @Consulta
, N'@Cant INT OUTPUT'
, @Cant_Filas OUTPUT
= 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.

Raúl Dario Levis escribio:
Tengo que realizar un SP que contenga un cursor. Este cursor lo
utilizo para obtener los nombres de las tablas dentro de una base de
datos (for select name from datos..sysobjects where type='U'), a su
vez el procedimiento me tiene que devolver una tabla con el nombre de
la tabla y la cantidad de filas.
Yo probé de la siguiente manera y no me funciona:
Create proc REPORTE
as
begin
create table #temporal (nam varchar(50),filas int)
declare cursor_tabla insensitive cursor
for select name from datos..sysobjects where type='U'
open cursor_tabla
declare @cant_filas int,
@nom_tabla varchar(40)
fetch next from cursor_tabla into @nom_tabla
while @@fetch_status= 0
Begin
execute('Select @cant= count(*) from '+@nom_tabla) /*
aquí da el error que me dice que @cant no esta declarado*/
insert into #temporal values(@nom_tabla,@cant)
fetch next from cursor_tabla into @nom_tabla
end
close cursor_tabla
deallocate cursor_tabla
end
El problema es con el execute y la asignacion del @cant, si no lo
puedo hacer así trataré de alguna otra forma.
desde yá muchisimas gracias
Respuesta Responder a este mensaje
#3 ulises
12/07/2004 - 03:41 | Informe spam
Si tu AUTO_UPDATE_STATISTICS de tu base de datos está en ON, la
siguiente sentencia te obtiene las tablas y la cantidad de filas que
contienen :

select user_name(o.uid) as owner,
o.name as tabla,
i.rowcnt as cantidad
from sysobjects o join sysindexes i on (o.id = i.id )
where o.xtype = 'U' and o.name != 'dtproperties'

Saludos,
Ulises

On Sun, 11 Jul 2004 11:23:59 -0300, "Raúl Dario Levis"
wrote:

Tengo que realizar un SP que contenga un cursor. Este cursor lo utilizo para
obtener los nombres de las tablas dentro de una base de datos (for select
name from datos..sysobjects where type='U'), a su vez el procedimiento me
tiene que devolver una tabla con el nombre de la tabla y la cantidad de
filas.
Yo probé de la siguiente manera y no me funciona:
Create proc REPORTE
as
begin
create table #temporal (nam varchar(50),filas int)
declare cursor_tabla insensitive cursor
for select name from datos..sysobjects where type='U'
open cursor_tabla
declare @cant_filas int,
@nom_tabla varchar(40)
fetch next from cursor_tabla into @nom_tabla
while @@fetch_status= 0
Begin
execute('Select @cant= count(*) from '+@nom_tabla) /* aquí
da el error que me dice que @cant no esta declarado*/
insert into #temporal values(@nom_tabla,@cant)
fetch next from cursor_tabla into @nom_tabla
end
close cursor_tabla
deallocate cursor_tabla
end
El problema es con el execute y la asignacion del @cant, si no lo puedo
hacer así trataré de alguna otra forma.
desde yá muchisimas gracias


Respuesta Responder a este mensaje
#4 Miguel Egea
12/07/2004 - 17:41 | Informe spam
Hola ulises, aun con esa opción levantada nada te asegura de que rowcnt
tenga un valor ok...


-

Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)
Brigada Anti-Cursores
Microsoft SqlServer M.V.P.

"ulises" escribió en el mensaje
news:
Si tu AUTO_UPDATE_STATISTICS de tu base de datos está en ON, la
siguiente sentencia te obtiene las tablas y la cantidad de filas que
contienen :

select user_name(o.uid) as owner,
o.name as tabla,
i.rowcnt as cantidad
from sysobjects o join sysindexes i on (o.id = i.id )
where o.xtype = 'U' and o.name != 'dtproperties'

Saludos,
Ulises

On Sun, 11 Jul 2004 11:23:59 -0300, "Raúl Dario Levis"
wrote:

>Tengo que realizar un SP que contenga un cursor. Este cursor lo utilizo


para
>obtener los nombres de las tablas dentro de una base de datos (for select
>name from datos..sysobjects where type='U'), a su vez el procedimiento me
>tiene que devolver una tabla con el nombre de la tabla y la cantidad de
>filas.
>Yo probé de la siguiente manera y no me funciona:
>Create proc REPORTE
>as
>begin
>create table #temporal (nam varchar(50),filas int)
>declare cursor_tabla insensitive cursor
>for select name from datos..sysobjects where type='U'
>open cursor_tabla
>declare @cant_filas int,
> @nom_tabla varchar(40)
>fetch next from cursor_tabla into @nom_tabla
>while @@fetch_status= 0
> Begin
> execute('Select @cant= count(*) from '+@nom_tabla) /*


aquí
>da el error que me dice que @cant no esta declarado*/
> insert into #temporal values(@nom_tabla,@cant)
> fetch next from cursor_tabla into @nom_tabla
> end
>close cursor_tabla
>deallocate cursor_tabla
>end
>El problema es con el execute y la asignacion del @cant, si no lo puedo
>hacer así trataré de alguna otra forma.
>desde yá muchisimas gracias
>
>

Respuesta Responder a este mensaje
#5 ulises
13/07/2004 - 06:50 | Informe spam
Ops, tienes toda la razón Miguel, en todo caso si se trata de una
consulta que se realizará fuera de horas de uso del sistema que aloja
la BBDD se puede actualizar las estadísticas y luego ejecutar la
consulta propuesta.

DBCC UPDATEUSAGE ('tubbdd' ) WITH COUNT_ROWS
SELECT ...

ojo, no lo aconsejo que se haga durante horas de uso de la BBDD porque
produciría bloqueos y afectaría el rendimiento.

Y a propósito, ¿es factible cambiar la frecuencia de actualización de
estos datos?, sé que la recarga aumenta pero pregunto solo por
curiiosidad ...

Saludos,
Ulises

On Mon, 12 Jul 2004 17:41:01 +0200, "Miguel Egea"
wrote:

Hola ulises, aun con esa opción levantada nada te asegura de que rowcnt
tenga un valor ok...


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