【问题标题】:Do I need to define a table variable in MSQL stored procudre if I want to call a stored procedure from excel VBA如果我想从 excel VBA 调用存储过程,是否需要在 SQL 存储过程中定义表变量
【发布时间】:2012-03-01 19:11:18
【问题描述】:

我尝试通过 VBA 从 excel 2007 调用存储过程。我想从存储过程中返回到 excel 表中。但是我在 Worksheets("Sheet1").Range("A1").CopyFromRecordset objMyRecordset 上得到“对象关闭时不允许运行 3074 操作”。

我做了很多没有结论的搜索。我只想知道是否需要先在MSSQL存储过程中定义一个表变量,然后再插入进去。

下面是我写的代码:

****** 存储过程 sp_weekly ****

select [field1], [field2] into mytable_2 from mytable_1

select a.*, b.field4 from mytable_2 a
inner mytable_3 b on join a.field1 = b.field3

******* 在 Excel Marcos 中

Option Explicit

Sub OpenConnection()

Dim objMyConn As ADODB.Connection
Dim objMyCmd As ADODB.Command
Dim objMyRecordset As ADODB.Recordset
Dim ConnectionString As String
Dim CommandText As String

Set objMyConn = CreateObject("ADODB.Connection")
Set objMyCmd = New ADODB.Command
Set objMyRecordset = New ADODB.Recordset



ConnectionString = "Provider=sqloledb;Data Source=abcsql,1433;Initial Catalog=admin;User Id=sa;Password=1234abcd;"
objMyConn.Open ConnectionString


Set objMyCmd.ActiveConnection = objMyConn
CommandText = "exec [admin].[dbo].[sp_weekly]"
objMyCmd.CommandType = adCmdText

Set objMyRecordset.Source = objMyCmd
objMyRecordset.Open 

Worksheets("Sheet1").Range("A1").CopyFromRecordset objMyRecordset

end

【问题讨论】:

    标签: excel excel-2007 vba


    【解决方案1】:

    您收到错误,因为查询没有返回任何结果。要执行存储过程,您需要执行以下操作:

    Sub PullFromStoredProc()
    
    Dim cn As ADODB.Connection
    Dim rs As ADODB.Recordset
    Dim cmd As ADODB.Command
    
    Set cn = New ADODB.Connection
    cn.Open _
                "Provider=sqloledb;" & _
                "Data Source=abcsql,1433;" & _
                "Initial Catalog=admin;" & _
                "User Id=sa;" & _
                "Password=1234abcd;"
    
    Set cmd = New ADODB.Command
    
    With cmd
        .CommandType = adCmdStoredProc
        .CommandText = "[admin].[dbo].[sp_weekly]"
        .ActiveConnection = cn
        Set rs = .Execute
    End With
    
    Sheet1.Range("A1").CopyFromRecordset rs
    
    
    rs.Close
    cn.Close
    
    End Sub
    

    【讨论】:

    • 谢谢。但它不想再次。同样的错误信息。我进行调试并找出执行何时通过 'end with, ,释放 with 语句中的所有值。
    • 执行 'end with' 后,.ActiveConnection 变为
    • 代码没问题,但是你的存储过程是错误的。您是否尝试过直接在 SQL Server Studio 中运行它?您的加入语法完全错误,请看这里link
    • 对不起。这是一个例子。我没有正确检查。我只是在我的程序中做了两个选择语句。真正的存储过程确实工作正常
    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多