sin utilizar cursores

12/05/2004 - 22:13 por fabian | Informe spam
hola,

quiero saber cuanto ocupan las tablas de mi BD utilizando para ello el proc
'sp_spaceused'

ej: exec sp_spaceused 'nombretabla'

donde 'nombretabla' sería una variable que contendría todas las tablas de
una consulta realizada a la tabla 'sysobjects'.

Sé como hacerlo con cursores, pero hay alguna otra forma?

con cursores lo haría asi:

declare @name varchar(50)
declare c cursor for
select name from sysobjects where xtype='U'
open c
fetch next from c into @name
while @@fetch_status=0
begin
exec sp_spaceused @name
fetch next from c into @name
end
close c
deallocate c

Saludos.

Preguntas similare

Leer las respuestas

#1 Maxi
12/05/2004 - 22:19 | Informe spam
Si queres si o si usar ese Store para saber ese Dato, no veo otra
alternativa.

Suerte


Salu2
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"fabian" escribió en el mensaje
news:%
hola,

quiero saber cuanto ocupan las tablas de mi BD utilizando para ello el


proc
'sp_spaceused'

ej: exec sp_spaceused 'nombretabla'

donde 'nombretabla' sería una variable que contendría todas las tablas de
una consulta realizada a la tabla 'sysobjects'.

Sé como hacerlo con cursores, pero hay alguna otra forma?

con cursores lo haría asi:

declare @name varchar(50)
declare c cursor for
select name from sysobjects where xtype='U'
open c
fetch next from c into @name
while @@fetch_status=0
begin
exec sp_spaceused @name
fetch next from c into @name
end
close c
deallocate c

Saludos.







Outgoing mail is certified Virus Free.
Checked by AVG anti-virus system (http://www.grisoft.com).
Version: 6.0.676 / Virus Database: 438 - Release Date: 05/05/2004
Respuesta Responder a este mensaje
#2 ulises
12/05/2004 - 23:02 | Informe spam
Pienso lo mismo, que no sé salva de usar cursores, aunque
podría usar el procedimiento alamcenado sp_MSForeachtable
(que también lo hace a través de un cursor), p.e.:

use pubs
exec sp_MSforeachtable 'sp_spaceused'

Saludos,
Ulises

Si queres si o si usar ese Store para saber ese Dato, no


veo otra
alternativa.

Suerte


Salu2
-


-
Maxi
Buenos Aires - Argentina
Desarrollador Microsoft 3 Estrellas .NET
-


-
Nunca consideres el estudio como una obligación sino como
una oportunidad para penetrar en el bello y maravillosos
mundo del saber.
- Albert Einstein



"fabian" escribió en el mensaje
news:%
hola,

quiero saber cuanto ocupan las tablas de mi BD




utilizando para ello el
proc
'sp_spaceused'

ej: exec sp_spaceused 'nombretabla'

donde 'nombretabla' sería una variable que contendría




todas las tablas de
una consulta realizada a la tabla 'sysobjects'.

Sé como hacerlo con cursores, pero hay alguna otra




forma?

con cursores lo haría asi:

declare @name varchar(50)
declare c cursor for
select name from sysobjects where xtype='U'
open c
fetch next from c into @name
while @@fetch_status=0
begin
exec sp_spaceused @name
fetch next from c into @name
end
close c
deallocate c

Saludos.
Respuesta Responder a este mensaje
#3 Eladio Rincón
12/05/2004 - 23:41 | Informe spam
Hola Fabián,

hay un procedimiento almacenado no documentado que lo realiza:
EXEC sp_msforeachtable 'EXEC sp_spaceused ''?'''

si te fijas en el código de sp_msforeachtable, llama a un procedimiento almacenado no documentado llamado sp_MSforeach_worker que abre un cursor y rellena una tabla temporal con el resultado de cada tabla ...

en fin, la forma en que lo haces es la correcta y no por ello tienes que intentar evitar el uso del cursor; los cursores están para cuando se necesitan y este es un ejemplo ;-)

Saludos,


Eladio Rincón
Torrevieja - Alicante
MCAD, SQL Server MVP
http://www.siquelnet.com

"Comparte lo que sabes, aprende lo que no sepas." FGG


fabian wrote:
hola,

quiero saber cuanto ocupan las tablas de mi BD utilizando para ello
el proc 'sp_spaceused'

ej: exec sp_spaceused 'nombretabla'

donde 'nombretabla' sería una variable que contendría todas las
tablas de una consulta realizada a la tabla 'sysobjects'.

Sé como hacerlo con cursores, pero hay alguna otra forma?

con cursores lo haría asi:

declare @name varchar(50)
declare c cursor for
select name from sysobjects where xtype='U'
open c
fetch next from c into @name
while @@fetch_status=0
begin
exec sp_spaceused @name
fetch next from c into @name
end
close c
deallocate c

Saludos.
Respuesta Responder a este mensaje
#4 Javier Loria
13/05/2004 - 00:10 | Informe spam
Hola Fabian:
Si, si la hay y no, no es usando sp_msforeachtable que tambien usa un
cursor.
La forma seria:
select sysobjects.name
, sum(case when sysindexes.indid<2 then rows
else 0 end) as rows
, sum(case when sysindexes.indid in (0,1,255) then sysindexes.reserved
else 0 end) * 8 as reserved
, sum(case when sysindexes.indid in (0,1) then sysindexes.dpages
when sysindexes.indid%5 then sysindexes.used
else 0 end) * 8 as Data
, (sum(case when sysindexes.indid in (0,1,255) then sysindexes.used
else 0 end)
- sum(case when sysindexes.indid in (0,1) then sysindexes.dpages
when sysindexes.indid%5 then sysindexes.used
else 0 end))*8 as index_size
, (sum(case when sysindexes.indid in (0,1,255) then
sysindexes.reserved-sysindexes.used
else 0 end)*8) as unused
from sysobjects
join sysindexes
on sysobjects.id=sysindexes.id
where xtype='U'
group by sysobjects.name

Esta es la forma en el desarrollador de sp_spacedused debio haberlo hecho si
alguien le hubiera explicado como hacer un CASE :(
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.

fabian escribio:
hola,

quiero saber cuanto ocupan las tablas de mi BD utilizando para ello
el proc 'sp_spaceused'

ej: exec sp_spaceused 'nombretabla'

donde 'nombretabla' sería una variable que contendría todas las
tablas de una consulta realizada a la tabla 'sysobjects'.

Sé como hacerlo con cursores, pero hay alguna otra forma?

con cursores lo haría asi:

declare @name varchar(50)
declare c cursor for
select name from sysobjects where xtype='U'
open c
fetch next from c into @name
while @@fetch_status=0
begin
exec sp_spaceused @name
fetch next from c into @name
end
close c
deallocate c

Saludos.
Respuesta Responder a este mensaje
#5 fabian
13/05/2004 - 14:22 | Informe spam
Muchas gracias a todos por las contestaciones.

Saludos,Fabian

"Javier Loria" escribió en el mensaje
news:
Hola Fabian:
Si, si la hay y no, no es usando sp_msforeachtable que tambien usa un
cursor.
La forma seria:
> select sysobjects.name
, sum(case when sysindexes.indid<2 then rows
else 0 end) as rows
, sum(case when sysindexes.indid in (0,1,255) then sysindexes.reserved
else 0 end) * 8 as reserved
, sum(case when sysindexes.indid in (0,1) then sysindexes.dpages
when sysindexes.indid%5 then sysindexes.used
else 0 end) * 8 as Data
, (sum(case when sysindexes.indid in (0,1,255) then sysindexes.used
else 0 end)
- sum(case when sysindexes.indid in (0,1) then sysindexes.dpages
when sysindexes.indid%5 then sysindexes.used
else 0 end))*8 as index_size
, (sum(case when sysindexes.indid in (0,1,255) then
sysindexes.reserved-sysindexes.used
else 0 end)*8) as unused
from sysobjects
join sysindexes
on sysobjects.id=sysindexes.id
where xtype='U'
group by sysobjects.name

> Esta es la forma en el desarrollador de sp_spacedused debio haberlo hecho


si
alguien le hubiera explicado como hacer un CASE :(
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.

fabian escribio:
> hola,
>
> quiero saber cuanto ocupan las tablas de mi BD utilizando para ello
> el proc 'sp_spaceused'
>
> ej: exec sp_spaceused 'nombretabla'
>
> donde 'nombretabla' sería una variable que contendría todas las
> tablas de una consulta realizada a la tabla 'sysobjects'.
>
> Sé como hacerlo con cursores, pero hay alguna otra forma?
>
> con cursores lo haría asi:
>
> declare @name varchar(50)
> declare c cursor for
> select name from sysobjects where xtype='U'
> open c
> fetch next from c into @name
> while @@fetch_status=0
> begin
> exec sp_spaceused @name
> fetch next from c into @name
> end
> close c
> deallocate c
>
> Saludos.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida