VBA 将日期参数传递给 SQL Server 存储过程

Posted

技术标签:

【中文标题】VBA 将日期参数传递给 SQL Server 存储过程【英文标题】:VBA passing date parameters to SQL Server stored procedure 【发布时间】:2017-02-19 01:39:49 【问题描述】:

我遇到了从 EXCEL VBA 代码传递给 SQL Server 存储过程的日期参数的问题。

存储过程采用两个日期参数@FromDate@ToDate。在 Excel 中,我想使用从单元格中获取的日期值执行此过程。

问题是,从单元格到过程的日期以"dd/mm/yyyy" 格式传递,而不管我在 excel 单元格中所做的任何格式更改。而 SQL 过程接受格式 "yyyy-mm-dd""yyyy-mon-dd""yyyy/mm/dd""dd-mon-yyyy"

程序抛出错误:

"从字符转换日期和/或时间时转换失败 字符串”用于从 excel 传递的日期(格式为“dd/mm/yyyy”

我使用的vba代码是(参考https://www.mssqltips.com/sqlservert...to-sql-server/)

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.

有没有办法以 SQL Server 过程接受的格式传递日期?如果没有其他选择,那么我将不得不选择将我的过程参数类型设置为 varchars 并将它们转换为日期。

感谢您对此的帮助!

【问题讨论】:

这适用于哪个 RDBMS?请添加标签以指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或其他完全不同的东西。 在 VBA 中将 FromDateToDate 变量声明为字符串。您希望将字符串连接到您的 CommandText SQL 字符串。否则你的Format() 是多余的。 @marc_s,我已经编辑了我的问题以标记数据库,即 sql server @Ralph,无论我在 excel 中使用什么格式作为日期,VBA 都会(在 msgbox 上)显示 dd/mm/yyyy 格式。例如,如果我输入 2016-sep-25,msgbox 会显示为 25/09/2016。 commandText 将代码构建为“EXEC dbo.spr_TestProcedure '@FromDate','@ToDate'”,当您右键单击 -> 表 -> 编辑查询时我可以看到。 .Refresh 是执行代码的那个。 @JNevill,是的,当我将 FromDate 和 ToDate 更改为字符串时它正在工作。感谢您指出选项。因此,表查询是使用 SQL 期望的日期格式构建的。虽然我现在卡住了查询没有执行,因此数据没有得到刷新,除了代码“ActiveWorkbook.Connections("TestConnection").Refresh" 【参考方案1】:

您可以将日期作为 char() 传递给 sp 并将其转换为日期。

【讨论】:

以上是关于VBA 将日期参数传递给 SQL Server 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给查询访问 VBA

将参数传递给 SQL Server 中的视图

通过 url 将参数传递给 sql server 报告服务

使用引号将参数传递给 SQL Server SP

将 xml 作为参数传递给 SQL Server 中的存储过程

如何将日期对象作为第一个也是唯一的输入参数传递给 PL-SQL