dimarts, 21 de novembre del 2017

Guardar SP d'SQL Server en una taula

A vegades ens trobem amb Stored Procedures d'SQL Server que ens retornen dades en format taula i ens agradaria poder guardar-los en una taula. La forma d'invocar un procediment i que el guardi en una taula és el següent:
insert into #la_nostra_taula EXEC sp_spaceused 'Taula'

La funció sp_spaceused és molt útil per que ens dóna informació sobre l'espai que ocupa una taula.


Però si volem saber aquesta informació de totes les taules hauríem d'invocar el procediment per cadascuna d'elles per separat. Si ho fem des del SSMS el resultat no és còmode de tractar.


En aquest cas serà útil invocar la funció per cada taula i guardar-lo en una taula final per després consultar-la.

Primer crearem una taula temporal per guardar les dades de la funció sp_spaceused. La funció sp_spaceused retorna varchars, però per nosaltres és més còmode tenir les dades en format nuèric per poder-les aggregar. Aleshores crearem una taula final amb els mateixos valors en format int.


create table #TaulaTemporalSpaceUSed (
    Name varchar(255),
    [rows] int,
    reserved varchar(255),
    data varchar(255),
    index_size varchar(255),
    unused varchar(255))
       
create table TaulaFinalMida (
    Name varchar(255),
    [rows] int,
    reservedKb int,
    dataKb int,
    reservedIndexSize int,
    reservedUnused int)

   
   
Per no haver d'executar la funció sp_spaceused per cada taula manualment executarem el procediment sp_MSforeachtable que recorre totes les taules de la BBDD on estem.
   
EXEC sp_MSforeachtable @command1="insert into #TaulaTemporalSpaceUSed
EXEC sp_spaceused '?'"
insert into TaulaFinalMida (Name, [rows], reservedKb, dataKb, reservedIndexSize, reservedUnused)
select name, [rows],
SUBSTRING(reserved, 0, LEN(reserved)-2),
SUBSTRING(data, 0, LEN(data)-2),
SUBSTRING(index_size, 0, LEN(index_size)-2),
SUBSTRING(unused, 0, LEN(unused)-2)
from #TaulaTemporalSpaceUSed

select * from TaulaFinalMida
order by reservedKb desc

drop table #TaulaTemporalSpaceUSed





Amb aquest script podem extreure de forma eficient i simple l'espai ocupat per les taules d'una BBDD. Si hi afegim el procediment sp_MSforeachdb podem recòrrer totes les BBDD i executant l'script anterior podrem etreure l'espai ocupat per totes les taules de totes les BBDD.