2016-07-29 7 views
1

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

Antwort

0

Haben Sie versucht, ein @ zum Hinzufügen von parameter?

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

Ich habe es funktioniert auf meinem PC.

die Linie Set rs = New ADODB.Recordset entfernen und die recordsetline zu Set rs = cmd.Execute

+0

Ich habe das jetzt versucht, aber das gleiche Ergebnis. Trotzdem danke. – user2916488

+0

Könnten Sie das Ergebnis der Zeile "Debug.Print cmd.Parameters (" AccCode "). Wert"? –

+0

'A221834' ist das Ergebnis von debug.print – user2916488

0

es schließlich Erarbeitet ändern ... war die Probleme, die ich Apostrophe auf jeder Seite des Parameterwert anzog. Ich dachte, dass dies korrekt wäre, da SQL sie erfordern würde, aber das Entfernen aus der VBA hat das Problem gelöst.

@Mister 832 - vielen Dank für Ihre Hilfe beim Durchlaufen.

Am Ende wurde die Lösung zu ändern:

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

zu

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

Grüßen

Verwandte Themen