我正在尝试以编程方式访问执行系统存储过程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变为变量...所以问题实际上是如何以编程方式访问由返回多个记录集的存储过程返回的数据...
我怎样才能做到这一点?
答案 0 :(得分: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
存储过程,那么这个解决方案怎么样:使用未记录的(但非常有帮助的)sp_MSforeachtable
存储过程为每个表迭代地调用sp_spaceused
你的数据库:
EXEC sp_MSforeachtable @command1="EXEC sp_spaceused '?'"
在这种情况下,您在数据库中为每个表获得一行,您应该能够捕获它并将其插入“空间使用表”。
希望这有帮助!
马克
答案 1 :(得分:0)
如果您使用的是.NET,当您使用结果填充DataSet时,它将为每个结果集创建一个数据表。