Como executar um procedimento SQL armazenado no Microsoft Excel?

4

Como posso executar um procedimento armazenado no Microsoft Excel e obter todos os dados que ele retorna?

    
por Safran Ali 19.08.2011 / 11:09

3 respostas

5

Este é um trabalho para uma conexão ADODB no VBA. Aqui está um link com um código de exemplo para uma consulta SELECT simples, mas isso também tratará dos procedimentos armazenados.

link

Os itens principais são a necessidade de declarar uma ADODB.Connection , ADODB.Recordset e uma string de conexão que corresponda ao seu banco de dados. Depois de abrir a conexão, você executa sua instrução SQL usando uma sintaxe como a seguinte (retirada do link):

With cnt 
    .CursorLocation = adUseClient 
    .Open stADO    // stADO is the connection string.
    .CommandTimeout = 0 
    Set rst = .Execute(stSQL) 
End With

Em seguida, mova os dados do seu conjunto de registros ( rst , acima) para um intervalo usando Range.CopyFromRecordSet .

    
por 19.08.2011 / 15:37
1

Não tenho certeza sobre a última encarnação do Excel, mas em 2000 e 2003 tudo o que você podia fazer era acessar uma exibição e ter seus dados exibidos na planilha do Excel.

A principal vantagem de um procedimento armazenado seria a capacidade de parametrizar o resultado, mas para isso você precisaria de algum tipo de interface do usuário e precisaria de uma maneira de modificar programaticamente a definição de consulta depois de ser definida pela primeira vez no Excel. . Não encontramos uma maneira de fazer isso, mas o uso de visualizações forneceu funcionalidade suficiente para o que precisávamos fazer.

    
por 19.08.2011 / 11:54
1

Esse VBA é muito parecido com a resposta do @Excelll, e eu usei isso com bons resultados em meu próprio trabalho.

Use esta pequena função de utilidade:

Public Function IsEmptyRecordset(rs As Recordset) As Boolean
     IsEmptyRecordset = ((rs.BOF = True) And (rs.EOF = True))
End Function

E então, aqui está a grande função (peço desculpas pelo alinhamento de parágrafos de má aparência):

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

Espero que isso ajude.

    
por 19.08.2011 / 16:25