sql-server - 使用 ADODB 中的变量从 SQL Server 存储过程返回结果

标签 sql-server excel vba stored-procedures

我正在研究一个记录过程,它将数据从 SQL Server 数据库中提取到 Excel 中,然后从另一个应用程序中提取出来以比较这两个来源。

我编写了一些代码,将数据拉入 ADODB 记录集,并将其从 SQL Server View 放入 Excel 工作表中。这按预期工作。

我需要查询更加动态,因为它在实际查询中非常耗费资源。我认为最好使用存储过程,将参数传递给查询并只返回我需要的结果集。

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

以下代码不向记录集返回任何记录并退出。

在 Management Studio 中使用相同的参数运行存储过程会得到 SSMS 中的预期结果。

存储过程:

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 - 感谢您的帮助。

最后解决方案发生了变化:

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


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

问候

关于sql-server - 使用 ADODB 中的变量从 SQL Server 存储过程返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38658184/

相关文章:

sql - 在 Access VBA 中更新 Excel Application.StatusBar

sql - 创建表时的条件输入

c# - 在自动化测试构建期间如何使用 BACPAC 恢复 Azure 数据库?

excel - 当多个单元格都为真时如何填充单元格

excel - 使用 VBA 在 Excel 中刷新对 VBProject.VBComponents 所做的更改

vba - 使用 Excel VBA 获取最终 URL

mysql - 查找两个不同表中两列中的不一致之处

sql - 在 sql 中调用 View 内部的 View 是不是很糟糕

excel - 将设置文本前置和附加到变量

excel - 如何使用 C# 从 DataSet 创建具有多个工作表的 Excel 文件