2009-08-07 10 views
1

システムストアドプロシージャsp_spaceusedの実行結果にプログラムでアクセスしようとしています。SQL 2005で複数のレコードセットを返すストアドプロシージャを読み取る出力

は、パラメータとしてオブジェクトの名前を渡す場合には、SPは、問題は、このストアドプロシージャは、パラメータなしで使用した場合は、異なる2返されることをこの



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) 

ように読むことができますレコードセットを返します



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 

私はちょうど変数にDATABASE_SIZEを取得したい...だから実際には問題はプログラムで複数のレコードセットを返すストアドプロシージャによって返されたデータにアクセスする方法です...

:このようなレコードセット、

どうすればいいですか?

答えて

2

私は、ストアドプロシージャによって返された2番目の結果セットを保持するという元の問題の解決策はありません。しかし、ここで、この場合、あなたはおそらくほぼ同じ情報をあなたに与えるべき、代わりにこのスクリプトを使用し、それは素敵な、きれいなT-SQLスクリプトだ可能性:あなたはまだ保存されsp_spaceusedを使用して主張する場合

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) 

procが、どのようにこのソリューションについて:データベースのテーブルごとに繰り返しsp_spaceusedを呼び出すために文書化されていない(ただし、非常に便利)sp_MSforeachtableストアドプロシージャを使用します。この場合、

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

を、あなたは、データベース内のテーブルごとに1つの行を取得し、あなたはそれを捕らえてあなたの "スペース使用テーブル"に挿入することができるはずです。

希望すると便利です。
Marc

0

.NETを使用している場合、データセットに結果を入力すると、結果セットごとにデータテーブルが作成されます。

+0

私は質問がSQLだけを扱うと思う。つまり、別のSQLコードスニペットから2番目の結果セットを取得します。それは.NETのタグが付いていません。 –

+0

ええ、Mehrdadは正しいです... – opensas

関連する問題