使用多个参数从Excel调用存储过程

时间:2016-04-22 16:57:57

标签: excel-vba stored-procedures vba excel

我已将SQL服务器连接到存储过程所在的数据库。存储过程在SQLServer中正常工作。存储过程从Excel中与硬编码参数的连接运行就好了。我得到了我的数据集,它被插入到我的电子表格中。宏不起作用。在宏中,我试图指向电子表格中包含我的参数值的范围,以便我可以在电子表格中键入值,然后让宏选择它们并将它们传递给存储过程。我对电子表格值和存储过程中的参数使用日期格式。我想要在宏运行时使用新数据在电子表格中更新返回的数据集。这是我的宏:

Sub GetHeatMapData()

    With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = "EXECUTE dbo.GetBillingHeatMap '" & Range("A9").Value & "" & Range("B9").Value & "'"

    End With
    ActiveWorkbook.Connections("CARLA-PC-Billing-SP").Refresh

End Sub

但是,如果我尝试从Excel中的宏运行存储过程,则会发生以下两种情况之一:

  1. 如果电子表格中存在从连接窗口运行存储过程的现有数据集,则宏运行时没有错误,但它没有获取动态变量,因此数据不会因为它而改变应该。

  2. 如果我从连接窗口中删除了通过运行存储过程创建的数据集,请选择数据应该开始的单元格,然后触发宏我得到'下标超出范围'错误并且没有任何反应。

  3. 我在存储过程结束时将NOCOUNT设置为关闭。以下是存储过程中的参数定义:

    -- Add the parameters for the stored procedure here
        @StartDate Date, 
        @EndDate Date
    

    以下是我的连接设置: enter image description here

    我的问题是为什么存储过程没有从Excel电子表格单元格中获取我的参数并使用它们来过滤返回的数据?

4 个答案:

答案 0 :(得分:1)

执行存储过程时,语句通常如下所示:

EXECUTE myProc('param1', 'param2')

命令扩展的方式如下:

EXECUTE myProc 'param1param2`

这是胡说八道。请尝试改为:

With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = "EXECUTE dbo.GetBillingHeatMap ('" & Range("A9").Value & "','" & Range("B9").Value & "');"

您可能仍会遇到日期格式问题,因此您也可以在VBA中处理:

With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = "EXECUTE dbo.GetBillingHeatMap ('" & FORMAT(Range("A9").Value, "m/d/yyyy") & "','" & FORMAT(Range("B9").Value, "m/d/yyyy") & "');"

最后,我发现将动态生成的sql发送到变量并在执行之前将其打印到debug / immediate窗口是一个好习惯,所以我可以捕获这样的东西。

sqlStatement = "EXECUTE dbo.GetBillingHeatMap ('" & FORMAT(Range("A9").Value, "m/d/yyyy") & "','" & FORMAT(Range("B9").Value, "m/d/yyyy") & "');"
debug.print sqlStatement
With ActiveWorkbook.Connections("CARLA-PC-Billing-SP").OLEDBConnection.CommandText = sqlStatement

现在,您将在您的即时窗口中显示您的语句,您可以将其复制并粘贴到SQL客户端,以独立于您的代码执行。

答案 1 :(得分:0)

你错过了逗号

“EXECUTE dbo.GetBillingHeatMap'”&范围(“A9”)。价值和范围“','”&范围(“B9”)。价值和范围“'”

答案 2 :(得分:0)

Sub Samp()
    Public con As New ADODB.Connection
    Public PassRecordset As New ADODB.Recordset
    Public objCmd As New ADODB.Command

    Dim Para1 As ADODB.Parameter
    Dim Para2 As ADODB.Parameter
    Dim Para3 As ADODB.Parameter

    'Check the database connection
    If con.State = 0 Then If Not CreateConnection 
       Then Exit Sub

    Set objCmd = New ADODB.Command
    objCmd.ActiveConnection = con

    With objCmd
      .ActiveConnection = con
      .CommandType = adCmdStoredProc
      .CommandText = StoredProcedureName

   End With
    
   Set Para1 = objCmd.CreateParameter("@TextPara1", adVarChar, adParamInput, 50, "Value1")
   objCmd.Parameters.Append Para1

   Set Para2 = objCmd.CreateParameter("@TextPara2", adVarChar, adParamInput, 255, "Value2")
   objCmd.Parameters.Append Para2
    
   Set Para3 = objCmd.CreateParameter("@DatePara3", adDate, adParamInput, , "DateValue")
   objCmd.Parameters.Append Para3
    
   Set PassRecordset = objCmd.Execute
    
   Sheet1.Range("A1").CopyFromRecordset PassRecordset

End Sub

答案 3 :(得分:-1)

1 - 在excel

中公开参数

enter image description here

2 - 定义从excel输入的参数

enter image description here

3 - 确定并刷新。

enter image description here

行, 您不必在命令文本中输入参数,您可以通过某种方式定义命令文本,以期将参数从excel单元格传递到存储过程。如果您所在的国家/地区不使用美国数据格式,这将非常有用。此外,它使最终用户能够使用其他一些参数进行刷新,而无需编辑命令文本。 这很简单 - 在excel中,在输入存储过程名称后,在命令文本中连接到sql server? - 尽可能多 ?因为你有不同的参数,你的商店程序期望(除以,) - 像这样 - 执行dbo.your_procedure?,? 之后,您进入参数选项卡(在您输入命令文本的同一表格上)并从女巫单元中定义女巫参数传递给存储过程。当然,在存储过程中还需要指定预期的参数:

创建程序[dbo]。[your_procedure]

( @DateFrom datetime, @DateTo datetime ) 如

---你的商店程序---

在excel中 - 参数1将发送到存储过程到DateFrom参数。