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