我想分析我的数据库并通过从ADODB命令或记录集执行"sp_MSforeachtable 'EXECUTE sp_spaceused [?];';"
将每个表的结果导入MS Excel工作表,然后使用CopyFromRecordset将结果输出到Excel中。
以下是我正在使用的代码:
Sub analyseHermesDB()
Dim oConn As Object, oRec As Object, oField As Object, iIndx As Integer
' sp_MSforeachtable 'EXECUTE sp_spaceused [?];';
Set oConn = CreateObject("ADODB.Connection")
Set oRec = CreateObject("ADODB.Recordset")
oConn.Open "FILE NAME=" & ThisWorkbook.Path & "\conn.udl"
With oRec
.activeconnection = oConn
.Source = "sp_MSforeachtable 'EXECUTE sp_spaceused [?];';"
.cursorlocation = 3
.Open
For iIndx = 0 To .fields.Count - 1
ActiveCell.Offset(0, iIndx).Value = .fields(iIndx).Name
Next
Do Until .EOF
ActiveCell.Offset(.absoluteposition, 0).CopyFromRecordset oRec
.movenext
Loop
ActiveCell.Offset(0, 1).Value = .RecordCount
.Close
End With
End Sub
问题是:当我在SQL Server 2008 Management Studio中执行"sp_MSforeachtable 'EXECUTE sp_spaceused [?];';"
时,我会为每个表获得一个结果集。
我只使用ADO从呼叫中获取一个记录集
我做错了什么?我应该尝试获取一组记录集,还是执行sp_MSforeachtable
来获取表列表,然后为每个表执行EXECUTE sp_spaceused [?];'
?
答案 0 :(得分:3)
sp_MSforeachtable返回多个结果集,您需要以这种方式使用它们
但是,您可以使用一些简单的SQL来实现您想要的功能 sp_spaceused无论如何都在内部使用类似的SQL ......
随意调整,这是我使用的脚本的精确复制/粘贴
SELECT
o.name,
SUM(ps.reserved_page_count)/128.0 AS ReservedMB,
SUM(ps.used_page_count)/128.0 AS UsedMB
FROM
sys.objects o
JOIN
sys.dm_db_partition_stats ps ON o.object_id = ps.object_id
WHERE
OBJECTPROPERTYEX(o.object_id, 'IsMSShipped') = 0
GROUP BY
o.name
ORDER BY
SUM(ps.reserved_page_count) DESC
答案 1 :(得分:1)
我只使用ADO从呼叫中获取一个记录集
这不是真的,你只评估一个记录集。使用NextRecordset
获取下一个记录集。
运行返回多个结果集的存储过程
Private Sub MultipleRSButton_Click()
Dim rs As New ADODB.Recordset
sql = "Select * from Authors Where year_born is not null; " _
& "Select * from Authors where year_born is null"
rs.Open sql, cn
Do
i = MsgBox("Ready for results?", vbYesNoCancel)
If i = vbYes Then
ADOGrid1.ShowData rs
Set rs = rs.NextRecordset
End If
Loop Until rs.State = adStateClosed
End Sub
注意Set rs = rs.NextRecordset
。