Как я могу выполнить хранимую процедуру в Microsoft Excel и получить все данные, которые она возвращает?
3 ответа
Это работа для подключения ADODB в VBA. Вот ссылка с примером кода для простого запроса SELECT, но он также будет обрабатывать хранимые процедуры.
http://www.ozgrid.com/forum/showthread.php?t=83016&page=1
Ключевыми элементами являются необходимость объявления ADODB.Connection
, ADODB.Recordset
и строки подключения, соответствующей вашей базе данных. После открытия соединения вы выполняете оператор SQL с использованием синтаксиса, подобного следующему (взято по ссылке):
With cnt
.CursorLocation = adUseClient
.Open stADO // stADO is the connection string.
.CommandTimeout = 0
Set rst = .Execute(stSQL)
End With
Затем переместите данные из набора записей (rst
выше) в диапазон, используя Range.CopyFromRecordSet
.
Я не уверен насчет последнего воплощения Excel, но в 2000 и 2003 годах все, что вы могли сделать, это получить доступ к представлению и отобразить его данные на листе Excel.
Основным преимуществом хранимой процедуры будет возможность параметризовать результат, но для этого вам понадобится какой-то пользовательский интерфейс, и вам потребуется способ программно изменить определение запроса после того, как оно будет сначала определено в Excel. Мы не нашли способ сделать это, но использование представлений предоставило достаточно функциональности для того, что нам нужно было сделать.
Этот VBA очень похож на ответ @ Excellll, и я хорошо использовал его в своей работе.
Используйте эту маленькую служебную функцию:
Public Function IsEmptyRecordset(rs As Recordset) As Boolean
IsEmptyRecordset = ((rs.BOF = True) And (rs.EOF = True))
End Function
А потом вот большая функция (я прошу прощения за неприглядное выравнивание абзаца):
Option Explicit
Public Sub OpenConnection()
Dim conn As ADODB.Connection
Dim str As String
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim myPath
Dim fld
Dim i As Integer
On Error GoTo errlbl
'Open database connection
Set conn = New ADODB.Connection
'First, construct the connection string.
'NOTE: YOU CAN DO THIS WITH A STRING SPELLING OUT THE ENTIRE CONNECTION...
'conn.ConnectionString = _
' "Provider=Microsoft.Jet.OLEDB.4.0;" & _
' "Data Source=" & _
' myPath & "\ConnectionTest.mdb"
'...OR WITH AN ODBC CONNECTION YOU'VE ALREADY SET UP:
conn.ConnectionString = "DSN=myDSN"
conn.Open 'Here's where the connection is opened.
Debug.Print conn.ConnectionString 'This can be very handy to help debug!
Set rs = New ADODB.Recordset
'Construct string. This can "Select" statement constructed on-the-fly,
'str = "Select * from vwMyView order by Col1, Col2, Col3"
'or an "Execute" statement:
str = "exec uspMyStoredProc"
rs.Open str, conn, adOpenStatic, adLockReadOnly ‘recordset is opened here
If Not IsEmptyRecordset(rs) Then
rs.MoveFirst
'Populate the first row of the sheet with recordset’s field names
i = 0
For Each fld In rs.Fields
Sheet1.Cells(1, i + 1).Value = rs.Fields.Item(i).Name
i = i + 1
Next fld
'Populate the sheet with the data from the recordset
Sheet1.Range("A2").CopyFromRecordset rs
Else
MsgBox "Unable to open recordset, or unable to connect to database.", _
vbCritical, "Can't get requested records"
End If
'Cleanup
rs.Close
Set rs = Nothing
conn.Close
Set conn = Nothing
exitlbl:
Debug.Print "Error: " & Err.Number
If Err.Number = 0 Then
MsgBox "All data has been pulled and placed on Sheet1", vbOKOnly, "All Done."
End If
Exit Sub
errlbl:
MsgBox "Error #: " & Err.Number & ", Description: " & Err.Description, _ vbCritical, "Error in OpenConnection()"
Exit Sub
'Resume exitlbl
End Sub
Надеюсь это поможет.