我正在研究一个记录过程,它将数据从 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/