Ich arbeite an einem Rec-Prozess, der Daten aus einer SQL Server-Datenbank in Excel und aus einer anderen Anwendung zum Vergleichen der beiden Quellen ziehen wird. Um dies zu tun, habe ich mit den Grundlagen begonnen und etwas Code geschrieben, der die Daten in einen ADODB-Datensatz zieht und sie in eine Excel-Tabelle von einer SQL Server-Ansicht ablegt. Dies funktioniert wie erwartet.Verwenden von VBA, um Ergebnisse von gespeicherten SQL Server-Prozedur mit Variablen in ADODB
Ich brauche die Abfrage, um dynamischer zu sein, und da es ziemlich rechenintensiv in der realen Abfrage ist, denke ich, es wäre besser, es mit einer gespeicherten Prozedur zu tun, Parameter an die Abfrage übergeben und nur die Ergebnismengen I zurückgeben brauchen.
Ich möchte nicht, dass die SQL-Abfrage in der VBA kompliziert ist, weshalb ich die Abfrage dort nicht einfach definieren kann.
Wenn ich den folgenden Code ausführen, gibt es keine Datensätze an den Datensatz und beendet. Das Ausführen der gespeicherten Prozedur in Management Studio mit demselben Parameter gibt die erwarteten Ergebnisse in SSMS an.
Fehle ich etwas darüber, wie diese Ergebnisse an den Datensatz zurückgegeben werden?
Stored Procedure:
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
VBA in Excel:
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
Ich habe an mehreren Beispielen anderer Leute sahen ähnliche Fragen zu stellen, aber sie alle scheinen zu versuchen, einen einzelnen Wert zu erhalten zurückgegeben, wie z. B. Status/Benutzer-ID usw. anstelle eines Datensatzes.
Grüße
Ich habe das jetzt versucht, aber das gleiche Ergebnis. Trotzdem danke. – user2916488
Könnten Sie das Ergebnis der Zeile "Debug.Print cmd.Parameters (" AccCode "). Wert"? –
'A221834' ist das Ergebnis von debug.print – user2916488