SQL Server 2005で複数のレコードセットを返す出力ストアドプロシージャを読み取ります

StackOverflow https://stackoverflow.com/questions/1247235

質問

私は、プログラムでシステムストアドプロシージャをsp_spaceusedを実行した結果にアクセスしようとしている。

あなたは、パラメータとしてオブジェクトの名前を渡すと、

、SPは

あなたはこのように読むことができますレコードセットを返します。


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番目の結果セットのホールドを得ることのあなたの元の問題のためのソリューションを持っていません。しかし、ここで、この場合、あなたはおそらくほぼ同じ情報をあなたに与えるべき、代わりにこのスクリプトを使用し、それは素敵な、きれいなT-SQLスクリプトだ可能性があります:

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) 

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

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

このケースでは、データベース内のテーブルごとに1つの行を取得し、あなたはそれをキャッチし、あなたの「スペース使用表」に挿入することができる必要があります。

この情報がお役に立てば幸い!
マルク

他のヒント

あなたは結果をDataSetを記入するときに、.NETを使用している場合、それは各結果セットのデータテーブルを作成します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top