使用VBA从ADODB中使用variables返回SQL Server存储过程的结果

我正在开发一个rec过程,它将数据从SQL Server数据库中导出到Excel中,然后从另一个应用程序中将这两个数据源进行比较。 为此,我已经开始使用基础知识,并编写了一些将数据提取到ADODBlogging集中的代码,并将其从SQL Server视图拖放到Excel工作表中。 这按预期工作。

我需要查询更加dynamic,因为它是真正的查询相当资源密集型,我认为最好是使用存储过程,将parameter passing给查询,只返回我需要的结果集。

我不希望SQL查询在VBA中变得复杂,这就是为什么我不能在那里定义查询。

当我运行下面的代码时,它不会将logging返回到logging集并退出。 在Management Studio中使用相同的参数运行存储过程给出了SSMS中的预期结果。

我是否错过了如何将这些结果返回到logging集?

存储过程:

CREATE PROCEDURE [dbo].[JoshTest] @AccCode nvarchar(50) AS SET NOCOUNT ON; SELECT [Account_SKey], [Hierarchy_SKey], [Account_Code], [Leaf] FROM [dbo].[VW_DIM_ACCOUNT_LEAF] WHERE [Leaf] = @AccCode; GO 

Excel中的VBA:

 Sub test_stored_proc() Dim AccountCodeVar As String AccountCodeVar = Range("ACCCODESEL").Value Dim osheet As String 'output sheet Dim orange As String 'output range osheet = "Output1" orange = "A3" Call ConnectSqlServerStoredProc(osheet, orange, AccountCodeVar) End Sub Function ConnectSqlServerStoredProc(osheet As String, orange As String, AccountCodeVar As String) 'Clear previous results Sheets("Output1").Range("A3:D60000").Clear Dim conn As ADODB.Connection Dim rs As ADODB.Recordset Dim sConnString As String Dim cmd As ADODB.Command Dim prm As ADODB.Parameter ' Create the connection string. sConnString = "Provider=SQLOLEDB;Data Source=CSIMCCS01; Initial Catalog=T_EXP_CPM; Integrated Security=SSPI;" Debug.Print sConnString ' Create the Connection and Recordset objects. Set conn = New ADODB.Connection Set rs = New ADODB.Recordset ' Open the connection and execute. conn.Open sConnString Set cmd = New ADODB.Command cmd.CommandText = "JoshTest" cmd.CommandType = adCmdStoredProc cmd.ActiveConnection = conn 'set parameter values Set prm = cmd.CreateParameter(Name:="AccCode", Type:=adVarChar, Direction:=adParamInput, Size:=10) cmd.Parameters.Append prm cmd.Parameters("AccCode").Value = "'" & AccountCodeVar & "'" Debug.Print cmd.Parameters("AccCode").Value Set rs = cmd.Execute ' Check we have data. If Not rs.EOF Then ' Transfer result. Sheets(osheet).Range(orange).CopyFromRecordset rs ' Close the recordset rs.Close Else MsgBox "Error: No records returned.", vbCritical End If ' Clean up If CBool(conn.State And adStateOpen) Then conn.Close Set conn = Nothing Set rs = Nothing MsgBox ("Done") End Function 

我已经看了几个其他人提出的类似问题的例子,但他们似乎都试图得到一个单一的价值观,如状态/用户ID等,而不是一个数据集。

问候

最终解决了…问题是,我把单引号的任何一方的参数值。 我认为这将是正确的,因为SQL会要求他们,但是把他们从VBA中解决了这个问题。

@Mister 832 – 感谢您的帮助。

最后,解决scheme正在发生变化:

 cmd.Parameters("@AccCode").Value = "'" & AccountCodeVar & "'" 

 cmd.Parameters("@AccCode").Value = AccountCodeVar 

问候

你有没有尝试添加@参数名?

 Set prm = cmd.CreateParameter(Name:="@AccCode", Type:=adVarChar, Direction:=adParamInput, Size:=10) cmd.Parameters.Append prm cmd.Parameters("@AccCode").Value = "'" & AccountCodeVar & "'" 

我在我的电脑上工作。

删除行Set rs = New ADODB.Recordset并将logging集更改为Set rs = cmd.Execute