使用ADO从Excel 2003执行“sp_MSforeachtable”(SQL Server 2008 R2)

时间:2013-05-16 11:35:03

标签: sql-server-2008 tsql excel-vba ado recordset

我想分析我的数据库并通过从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 [?];'

2 个答案:

答案 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获取下一个记录集。

来自Visual Basic Concepts

  

运行返回多个结果集的存储过程

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

但是出于所有意图和目的,gbnanswer可能更好;它不依赖于未记录的存储过程。