lire la procédure stockée de sortie qui renvoie plusieurs jeux d'loggings dans sql 2005

J'essaie d'accéder par programme au résultat de l'exécution de la procédure stockée système sp_spaceused.

si vous passez le nom d'un object en paramètre, le sp renvoie un jeu d'loggings que vous pouvez lire comme ça

CREATE TABLE #TempTable ( [Table_Name] varchar(50), Row_Count int, Table_Size varchar(50), Data_Space_Used varchar(50), Index_Space_Used varchar(50), Unused_Space varchar(50) ) insert into #TempTable EXEC( 'sp_spaceused "tablexx"' ) select * from #TempTable Table_Name Row_Count Table_Size Data_Space_Used Index_Space_Used Unused_Space ------------ ----------- ----------- ---------------- ----------------- ------------ tablexx 67 64 KB 16 KB 48 KB 0 KB (1 row(s) affected) (1 row(s) affected) 

le problème est que cette procédure stockée, lorsqu'elle est utilisée sans parameters, renvoie deux jeux d'loggings différents, comme ceci:

 sp_spaceused database_name database_size unallocated space -------------- -------------- ------------------ Convenios 11622.75 MB 3.16 MB reserved data index_size unused ------------- ------------- ----------- --------- 11897696 KB 11784392 KB 103264 KB 10040 KB 

Je veux juste get la taille de database dans une variable … Ainsi, le problème est en fait comment accéder par programme aux données returnnées par une procédure stockée qui renvoie plusieurs jeu d'loggings …

Comment puis-je atteindre cet objective?

Je n'ai pas de solution à votre problème d'origine pour get le second jeu de résultats renvoyé par la procédure stockée. Mais dans ce cas ici, pourriez-vous utiliser ce script à la place, ce qui devrait vous donner à peu près la même information, et c'est un bon script T-SQL propre:

 SELECT t.NAME AS TableName, i.name as indexName, p.[Rows], sum(a.total_pages) as TotalPages, sum(a.used_pages) as UsedPages, sum(a.data_pages) as DataPages, (sum(a.total_pages) * 8) / 1024 as TotalSpaceMB, (sum(a.used_pages) * 8) / 1024 as UsedSpaceMB, (sum(a.data_pages) * 8) / 1024 as DataSpaceMB FROM sys.tables t INNER JOIN sys.indexes i ON t.OBJECT_ID = i.object_id INNER JOIN sys.partitions p ON i.object_id = p.OBJECT_ID AND i.index_id = p.index_id INNER JOIN sys.allocation_units a ON p.partition_id = a.container_id WHERE t.NAME NOT LIKE 'dt%' AND i.OBJECT_ID > 255 AND i.index_id <= 1 GROUP BY t.NAME, i.object_id, i.index_id, i.name, p.[Rows] ORDER BY object_name(i.object_id) 

Si vous persistez à utiliser le proc stocké sp_spaceused , qu'en est-il de cette solution: utilisez le proc stocké sp_MSforeachtable non documenté (mais extrêmement utile) pour appeler sp_spaceused manière itérative pour chaque table de votre database:

 EXEC sp_MSforeachtable @command1="EXEC sp_spaceused '?'" 

Dans ce cas, vous obtenez une ligne par table dans la database et vous devriez être capable de l'attraper et de l'insert dans votre "table utilisée par l'espace".

J'espère que cela t'aides!
Marc

Si vous utilisez .NET, lorsque vous remplissez un DataSet avec les résultats, il crée une donnée pour chaque jeu de résultats.