0

我曾多次使用与 SQL Server 相关的 VBA 宏,但它们始终是单个“选择”语句或调用返回单个结果集的存储过程。现在我发现自己正在编写一个宏,该宏将调用一个存储过程,但该存储过程返回多个结果集。宏是否可以捕获每个 SQL 结果集并将其放在不同的工作表上?任何示例和/或指导将不胜感激。

4

2 回答 2

4

使用 .NextRecordset 很容易做到这一点。

Dim rs As ADODB.Recordset, success As Boolean
success = getAResultWith2Recordsets(rs)
If success = False Then
    MsgBox "Unable to records, no data"
    Exit Sub
Else
    Set Me.Recordset = rs ' for example on a report
    Set SecondRs = New ADODB.Recordset ' create empty recordset
    Set SecondRs = rs.NextRecordset ' assign it the next batch result
    Set rs = Nothing
End If

等等。这只是一个示例,您将在.nextRecordset的手册中找到所有必要的信息,例如如何迭代它们。

于 2012-10-11T14:51:56.830 回答
0

YMMV;但在大多数情况下,每个查询返回多个记录集违反“最佳实践”,因为它们按序号(0、1、2)返回,因此它不是自记录的。但是,假设您正在编写此代码并且知道记录集的顺序,则类似的方法会起作用。

'' ---> Assuming you have logic to execute SQL and place results into a DataSet <--- ''

dt = ds.tables(0)
if dt.rows.count  > 0 then

    '' This datatable as datarows ''
    '' apply logic relevant to specific worksheet ''


end if

dt = ds.tables(1)
if dt.rows.count  > 0 then

    '' This datatable as datarows ''
    '' apply logic relevant to specific worksheet ''


end if

dt = ds.tables(2)
if dt.rows.count  > 0 then

    '' This datatable as datarows ''
    '' apply logic relevant to specific worksheet ''


end if
dt.dispose
ds.dispose

---> 你也可以迭代数据表集合;但这并不完全优雅。

dim i as integer = 0
for i = 0 to ds.tables.count-1
    dt = ds.tables(i)
    if dt.rows.count> 0 then

        '' Apply worksheet logic here ''

    end if
next

此代码未经测试。

于 2012-10-11T15:41:59.073 回答