0

SQL サーバーに関連して VBA マクロを数回使用しましたが、それらは常に単一の「select」ステートメントであるか、単一の結果セットを返すストアド プロシージャを呼び出していました。現在、ストアド プロシージャを呼び出すマクロを作成していますが、ストアド プロシージャは複数の結果セットを返します。マクロで各 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 に答える