Excel VBA调用SQL存储过程(日期参数-无结果!)

果酱三明治

最后,通过添加Set NOCOUNT ON存储过程使此代码正常工作当我使用日期作为参数时,我很难获得结果。

代码如下-

Sub Button1_Click()

Dim con As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.RecordSet
Dim WSP1 As Worksheet

Set con = New ADODB.Connection
Set cmd = New ADODB.Command
Set rs = New ADODB.RecordSet

'''Clear extract area'''
Worksheets("Extract").UsedRange.Delete

'''Log into SQL Server'''
con.Open "Provider = SQLOLEDB;" & _
         "Data Source = MySource;" & _
         "Initial Catalog = MyDatabase;" & _
         "User ID = MyUser;" & _
         "Password = MyPassword;"
cmd.ActiveConnection = con

'''Set up parameters for stored procedure'''
'cmd.Parameters.Append cmd.CreateParameter("lot", adVarChar, adParamInput, 7, Range("C4"))

cmd.Parameters.Append cmd.CreateParameter("startDate", adDBTimeStamp, adParamInput, Range("C2"))
cmd.Parameters.Append cmd.CreateParameter("endDate", adDBTimeStamp, adParamInput, Range("C3"))

'adDBTimeStamp

cmd.CommandText = "DB.MyStoredProc"
Set rs = cmd.Execute(, , adCmdStoredProc)

Set WSP1 = Worksheets("Extract")
WSP1.Activate
If rs.EOF = False Then WSP1.Cells(1, 1).CopyFromRecordset rs

rs.Close
Set rs = Nothing
Set cmd = Nothing

con.Close
Set con = Nothing

End Sub

正如我所说,仅使用第一个参数,就可以按预期将结果粘贴到工作表中。当我注释掉该行并尝试使用两个日期参数运行时,我什么也没得到。

该代码运行没有错误,但显示了一个空的工作表。我感觉这与日期格式有关,但是不确定如何根据需要将日期输入到SQL中。

有人可以帮忙吗?

---更新---我尝试像这样设置参数-

Set prm = cmd.CreateParameter("startDate", adDate, adParamInput)
        cmd.Parameters.Append prm
        cmd.Parameters("startDate").Value = "2017-07-17"

Set prm = cmd.CreateParameter("endDate", adDate, adParamInput)
        cmd.Parameters.Append prm
        cmd.Parameters("endDate").Value = "2017-07-19"

但是Excel VBA似乎仍以dd / mm / yyyy格式发送日期!

-更新2 ---

按照@avb的回答,我将代码更改为包含以下内容-

Dim sql As String
sql = "exec DB.myStoredProc '__dateParameter1__', '__dateParameter2__' ;"
sql = Replace(sql, "__dateParameter1__", Format(Range("C2").Value, "yyyy-mm-dd"))
sql = Replace(sql, "__dateParameter2__", Format(Range("C3").Value, "yyyy-mm-dd"))

cmd.CommandText = sql
Set rs = cmd.Execute()

这似乎以正确的格式传递日期值,但仍返回空记录集。和以前一样,使用单个值VarChar测试相同的字符串也可以正常工作。只是当我使用2个日期参数时。

在菜单中单击“执行”时,由SSMS生成的有效SQL查询-

DECLARE @return_value int

EXEC    @return_value = [DB].[myStoredProc]
        @startDate = N'2017-07-20'

SELECT  'Return Value' = @return_value

GO

从VBA复制的工作查询(拉单个批号)

exec DB.myStoredProc '4238176' ;

来自VBA的无效查询(尝试在此日期之后提取所有批次)

exec DB.myStoredProc '2017-07-20' ;
Avb

Range("C2")在CreateParameter中替换
Format(Range("C2").Value, "yyyymmdd")

日期格式yyyymmdd是唯一始终可以被sql server识别的格式,而无需考虑您的语言环境。

不使用参数构造sql语句:

Dim sql As String  
sql = "exec DB.MyStoredProc '__dateParameter__' ;"
sql = Replace(sql, "__dateParameter__", Format(Range("C2").Value, "yyyymmdd"))

cmd.CommandText = sql
Set rs = cmd.Execute()  

最后看来存储过程首先有一个可选参数,它是除日期以外的其他值,因此正确的答案是:

Dim sql As String  
sql = "exec DB.MyStoredProc null, '__dateParameter__' ;"
sql = Replace(sql, "__dateParameter__", Format(Range("C2").Value, "yyyymmdd"))

cmd.CommandText = sql
Set rs = cmd.Execute()  

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章