如何从Access 2010中的SQL存储过程返回多个记录集

时间:2013-12-03 16:04:59

标签: sql sql-server-2008 stored-procedures views ms-access-2010

我在Access中创建了一个传递查询,它执行一个存储过程,搜索SQL数据库中所有表的字符串。 SQL Server上的存储过程按预期运行,返回包含我的搜索字符串值的多个Recordset。但是,当我在Access中双击传递查询时,在数据表视图中,我只看到一个Recordset的结果。由于Access似乎不是为处理多个结果集而设计的,那么如何在Access中使用VBA来实现此目的呢?

exec sqlsp_searchalltables @Tablenames='',  @SearchStr='%motion%'

1 个答案:

答案 0 :(得分:3)

我不太确定您希望如何将表单“绑定”到存储过程返回的多个记录集,但据我所知,处理返回多个记录集的SQL Server存储过程的唯一方法是使用ADODB.Recordset对象。

(不要被“Recordset.NextRecordset Method(DAO)”文章here误导。如果你尝试这种方法,你将收到运行时错误'3847':“不再支持ODBCDirect。重写代码以使用ADO而不是DAO。“)

例如,我有一个SQL Server存储过程,它返回两个记录集,我创建一个名为[dbo_myMultiRsSp_1]的传递来调用它:

EXEC dbo.myMultiRsSp @id=1

如果我通过双击它在数据表视图中打开它,我会看到第一个记录集的结果。

如果我想要处理VBA中的所有记录集,我不能直接使用传递查询,但我可以使用其.Connect.SQL属性,如下所示

Option Compare Database
Option Explicit

Sub MultiRsSpTest()
    Dim cdb As DAO.Database
    Dim con As ADODB.Connection, cmd As ADODB.Command
    Dim r1 As ADODB.Recordset, r2 As ADODB.Recordset

    Set cdb = CurrentDb
    Set con = New ADODB.Connection

    ' connect directly to the SQL Server 
    '    (by using the .Connect property of the pass-through query)
    con.Open Mid(cdb.QueryDefs("dbo_myMultiRsSp_1").Connect, 5)  ' omit "ODBC:" prefix
    Set cmd = New ADODB.Command
    cmd.ActiveConnection = con
    cmd.CommandType = adCmdText
    cmd.CommandText = cdb.QueryDefs("dbo_myMultiRsSp_1").SQL

    Set r1 = cmd.Execute
    Debug.Print
    Debug.Print "First Recordset:"
    Do Until r1.EOF
        Debug.Print r1(0).Value
        r1.MoveNext
    Loop

    Set r2 = r1.NextRecordset
    Debug.Print
    Debug.Print "Second Recordset:"
    Do Until r2.EOF
        Debug.Print r2(0).Value
        r2.MoveNext
    Loop

    ' r1.Close  (happens implicitly)
    Set r1 = Nothing
    r2.Close
    Set r2 = Nothing
    Set cmd = Nothing
    Set con = Nothing
    Set cdb = Nothing
End Sub