![](/img/trans.png)
[英]Excel VBA Code to check if a stored procedure exists on SQL Server 2014
[英]Excel VBA - Stored Procedure (SQL Server)
我有一個小問題,檢索多個記錄集(帶有列名)並將數據粘貼到Excel工作表中,如下圖所示
我剛剛檢索到第一個記錄集而不是其余記錄集的VBA代碼
任何幫助將不勝感激,謝謝
Sub CProcedure()
Dim Conn As ADODB.Connection, RecordSet As ADODB.RecordSet
Dim Command As ADODB.Command
Dim ConnectionString As String, StoredProcName As String
Dim range1 As ADODB.Parameter, range2 As ADODB.Parameter
Dim SP_Param1 As String
Dim SP_Param2 As String
Application.ScreenUpdating = False
Set Conn = New ADODB.Connection
Set RecordSet = New ADODB.RecordSet
Set Command = New ADODB.Command
ServerName = "1111"
DatabaseName = "dataReporting"
UserId = "88888"
Password = "88888"
SP_Param1 = "StartDate"
SP_Param2 = "EndDate"
StoredProcName = "KPI_Report"
ConnectionString = "PROVIDER=SQLOLEDB;DATA SOURCE=" & ServerName & _
";INITIAL CATALOG=" & DatabaseName & "; User Id=" & _
UserId & "; Password=" & Password & ";"
Conn.Open ConnectionString
With Command
.ActiveConnection = Conn
.CommandType = adCmdStoredProc
.CommandText = StoredProcName
.CommandTimeout = 0
End With
Set range1 = Command.CreateParameter(SP_Param1, adDBDate, adParamInput, , DateSerial(2018, 1, 1))
Command.Parameters.Append range1
Set range2 = Command.CreateParameter(SP_Param2, adDBDate, adParamInput, , DateSerial(2018, 4, 1))
Command.Parameters.Append range2
Set RecordSet = Command.Execute
Sheets("Sheet1").Range("A2").CopyFromRecordset RecordSet
RecordSet.Close
Conn.Close
On Error GoTo 0
Application.ScreenUpdating = True
Exit Sub
End Sub
更新
我添加了以下循環,但仍然沒有運氣
'Loop through recordset and place values
RecordSet.MoveFirst
Do While RecordSet.EOF = False
For i = 0 To RecordSet.Fields.Count - 1
ActiveCell.Value = RecordSet.Fields(i).Value
ActiveCell.Offset(0, 1).Activate
Next i
ActiveCell.Offset(1, -i).Activate
RecordSet.MoveNext
Loop
這是存儲過程代碼:
Sub storedproc()
Dim Conn As ADODB.Connection
Dim ADODBCmd As ADODB.Command
Dim rs As ADODB.RecordSet
Dim i As Integer
Dim sConnect As String
ServerName = "1111"
DatabaseName = "dataReporting"
UserId = "88888"
Password = "88888"
SP_Param1 = "StartDate"
SP_Param2 = "EndDate"
StoredProcName = "KPI_Report"
sConnect = "PROVIDER=SQLOLEDB;DATA SOURCE=" & ServerName &
";INITIAL CATALOG=" & DatabaseName & "; User Id=" & UserId &
"; Password=" & Password & ";"
'Establish connection
Set Conn = New ADODB.Connection
Conn.ConnectionString = sConnect
Conn.Open
'Open recordset
Set ADODBCmd = New ADODB.Command
ADODBCmd.ActiveConnection = Conn
ADODBCmd.CommandText = StoredProcName
ADODBCmd.CommandType = adCmdStoredProc
ADODBCmd.CommandTimeout = 0
Set range1 = ADODBCmd.CreateParameter(SP_Param1, adDBDate, adParamInput, , DateSerial(2018, 1, 1))
ADODBCmd.Parameters.Append range1
Set range2 = ADODBCmd.CreateParameter(SP_Param2, adDBDate, adParamInput, , DateSerial(2018, 4, 1))
ADODBCmd.Parameters.Append range2
Set rs = ADODBCmd.Execute()
'Loop through recordset and place values
rs.MoveFirst
Do While rs.EOF = False
For i = 0 To rs.Fields.Count - 1
ActiveCell.Value = rs.Fields(i).Value
ActiveCell.Offset(0, 1).Activate
Next i
ActiveCell.Offset(1, -i).Activate
rs.MoveNext
Loop
'Clean up
rs.Close
Set rs = Nothing
End Sub
S Meaden提到GetNextRecordSet
的答案解決了因存儲過程導致多個記錄集的問題。
以下代碼將所有記錄集(包括字段名稱)轉儲到工作表中(如果重復運行,請不要忘記首先清理工作表)。
...
Set rs = Command.Execute
Dim startcol As Long
startcol = 1
With ThisWorkbook.Sheets(1)
Do While Not rs Is Nothing
Dim col As Long
For col = 0 To rs.Fields.Count - 1
.Cells(1, startcol + col) = rs.Fields(col).Name
Next col
.Cells(2, startcol).CopyFromRecordset rs
startcol = startcol + rs.Fields.Count + 1
Set rs = rs.NextRecordset
Loop
End With
因此,存儲過程需要返回多個記錄集,例如
CREATE PROCEDURE GetCarsAndCategories
AS
BEGIN
SELECT * FROM Cars
SELECT * FROM Categories
END
然后VBA代碼最初可以訪問Cars記錄集並進入類別記錄集,一個調用GetNextRecordSet
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.