【问题标题】:Using parameters on Excel Connections to SQL Server在 Excel 与 SQL Server 的连接上使用参数
【发布时间】:2018-07-13 09:33:07
【问题描述】:

几个月来我一直在努力解决我的需求,今天我找到了解决方案,或者如果您愿意的话,可以解决它。

该解决方案的灵感来自我在这里找到的一篇帖子:

how to pass parameters to query in SQL (Excel)

而且,尽管我想感谢 @mono código 的想法,但由于我缺乏声誉,我无法在原始线程上对帖子发表任何评论。所以我想发布这个来感谢并帮助其他人度过难关。

我的第一个方法是使用 Power Query,但之后对脚本进行修改非常复杂。这种方法在 IMO 上要简单得多。

它基本上是获取连接的命令文本并即时修改它:

With ActiveWorkbook.Connections("MyConnection").OLEDBConnection
    queryOriginalText = .CommandText
    queryPreText = .CommandText

    queryPostText = Replace(queryPreText, "SET @From=@From", "SET @From='" & Range("StartDate") & "'")
    queryPreText = queryPostText
    queryPostText = Replace(queryPreText, "SET @To=@To", "SET @To='" & Range("EndDate") & "'")
    queryPreText = queryPostText
    queryPostText = Replace(queryPreText, "SET @OrderNo=@OrderNo", "SET @OrderNo='" & Range("OrderNo") & "'")

    .CommandText = queryPostText
    ActiveWorkbook.Connections("MyConnection").Refresh
    .CommandText = queryOriginalText
End With

我的脚本有 3 个变量用作过滤数据的条件: @From@To@OrderNo。而且,当我在脚本上设置这些内容时,我会这样做:

SET @From=@From
SET @To=@To
SET @OrderNo=@OrderNo

在我的 VBA 中,我查找那些特定的字符串,并将它们一一替换为用户在工作表上输入的值,在具有范围名称的特定单元格上。

最后,我放回了原始文本,因此当用户点击运行宏的按钮时,要替换的字符串始终存在。这仅在您取消选中该选项时才有效

Connection Properties

否则会出现运行时错误。

希望对你有帮助

【问题讨论】:

  • 如果您的目标是提供问题和解决方案,请仅在问题部分中发布问题,然后在下面的答案区域中回答您自己的问题。
  • 你为什么要这样做,究竟是什么?!
  • @ryguy72 例如,当从 MSSQL 检索数据并想要指定数据范围时。为此,用户必须编辑连接和脚本本身。对于某些用户来说,这是“高级”的东西,所以如果他们只在电子表格的两个单元格上指定日期,然后我在上面进行动态更改,那就更好了。

标签: vba excel


【解决方案1】:

您是说需要将变量传递给 ConnectionString 吗?这似乎根本不对。将日期传递给传递给 ConnectionSting 的查询。按照这个例子。

Private Sub CommandButton1_Click()
Dim FromDate As Date
Dim ToDate As Date

FromDate = Format(Sheets("Sheet1").Range("B1").Value, "yyyy-mm-dd") 'Pass value from cell B1 to SellStartDate variable
ToDate = Format(Sheets("Sheet1").Range("B2").Value, "yyyy-mm-dd") 'Pass value from cell B2 to SellEndDate variable

MsgBox FromDate
MsgBox ToDate

'Pass the Parameters values to the stored procedure used in the data connection
With ActiveWorkbook.Connections("TestConnection").OLEDBConnection
.CommandText = "EXEC dbo.spr_TestProcedure '" & FromDate & "','" & ToDate & "'"
ActiveWorkbook.Connections("TestConnection").Refresh

End With
End Sub

此外,按照下面链接中的示例进行操作可能会有所帮助。

https://www.mssqltips.com/sqlservertip/3436/passing-dynamic-query-values-from-excel-to-sql-server/

如果您对此仍有疑问,请回复。

【讨论】:

  • 当您在后端有一个存储过程时,这非常有效,但在我的情况下,我无法创建一个存储过程,因此它是您针对数据库引擎运行的本机 sql 脚本。这就是为什么我做我在帖子中描述的事情
  • 如果您在那台机器上没有存储过程,我不确定如何帮助您。也许其他人会提出可行的解决方案。
  • 其实帖子有问题的解决办法
  • 是的,很抱歉,但是这个解决方案在很多方面都是错误的:[1] 你必须存储过程,[2] 链接 mssqltips 使用了一个对 SQL 注入开放的示例。我将使用纯 VBA 发布更好的解决方案
猜你喜欢
  • 2016-05-21
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
相关资源
最近更新 更多