Compartilhar via


Como executar uma chamada a um procedimento armazenado (OLE DB)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

Baixar o driver do OLE DB

Um procedimento armazenado pode ter zero ou mais parâmetros. Também pode retornar um valor. Ao usar o Driver do OLE DB para SQL Server, os parâmetros para um procedimento armazenado podem ser transmitidos da seguinte forma:

  • Hard-coding o valor de dados.
  • Usando um marcador de parâmetro (?) para especificar parâmetros, associar uma variável de programa ao marcador de parâmetro e, em seguida, inserir o valor dos dados na variável de programa.

Observação

Ao chamar procedimentos armazenados do SQL Server que usam parâmetros denominados com o OLE DB, os nomes de parâmetros devem começar com o caractere "@". Esta é uma restrição específica do SQL Server. O Driver do OLE DB para SQL Server impõe esta restrição mais estritamente que o MDAC.

Para dar suporte aos parâmetros, a interface ICommandWithParameters é exposta no objeto de comando. Para usar parâmetros, o consumidor primeiro descreve os parâmetros para o provedor, chamando o método ICommandWithParameters::SetParameterInfo (ou, como opção, prepara uma instrução de chamada que chama o método GetParameterInfo). O consumidor cria um acessador que especifica a estrutura de um buffer e coloca os valores dos parâmetros nesse buffer. Finalmente, ele transmite o identificador do acessador e um ponteiro ao buffer para Executar. Em chamadas posteriores para Executar, o consumidor coloca novos valores de parâmetros no buffer e chama Executar com o identificador do acessador e o ponteiro do buffer.

Um comando que executa uma chamada a um procedimento armazenado temporário usando parâmetros, primeiro deverá executar uma chamada ao ICommandWithParameters::SetParameterInfo para definir as informações dos parâmetros. Essa chamada deverá ser executada antes que seja possível preparar o comando com êxito. Este requisito é necessário porque o nome interno de um procedimento armazenado temporário difere do nome externo usado por um cliente. O MSOLEDBSQL não pode consultar as tabelas do sistema para determinar as informações dos parâmetros de um procedimento armazenado temporário.

Os seguintes itens representam etapas do processo de associação de parâmetros:

  1. Preencha as informações dos parâmetros em uma matriz de estruturas DBPARAMBINDINFO; isto é, nome do parâmetro, nome específico do provedor para o tipo de dados do parâmetro ou um nome de tipo de dados padrão, e assim por diante. Cada estrutura na matriz descreve um parâmetro. Em seguida, essa matriz é transmitida ao método SetParameterInfo.

  2. Chame o método ICommandWithParameters::SetParameterInfo para descrever parâmetros ao provedor. SetParameterInfo especifica o tipo de dados nativo de cada parâmetro. Os argumentos de SetParameterInfo são:

    • O número de parâmetros para o qual definir informações de tipo.
    • Uma matriz de ordinais de parâmetro para a qual definir informações de tipo.
    • Uma matriz de estruturas DBPARAMBINDINFO.
  3. Crie um acessador de parâmetro usando o comando IAccessor::CreateAccessor. O acessador especifica a estrutura de um buffer e coloca valores dos parâmetros no buffer. O comando CreateAccessor cria um acessador de um conjunto de associações. Essas associações são descritas pelo consumidor usando uma matriz de estruturas DBBINDING. Cada associação liga um único parâmetro ao buffer do consumidor e contém informações como:

    • O ordinal do parâmetro ao qual a associação se aplica.
    • O que é associado (o valor de dados, seu comprimento e seu status).
    • O deslocamento no buffer para cada uma destas partes.
    • O comprimento e o tipo do valor de dados, como existe no buffer do consumidor.

    Um acessador é reconhecido por seu identificador, que é do tipo HACCESSOR. Esse identificador é retornado pelo método CreateAccessor. Sempre que o consumidor termina de usar um acessador, o consumidor deve chamar o método ReleaseAccessor para liberar a memória que ele detém.

    Quando o consumidor chama um método, como ICommand::Execute, transmite o identificador a um acessador e um ponteiro para um buffer propriamente dito. O provedor usa esse acessador para determinar como transferir os dados contidos no buffer.

  4. Preencha a estrutura DBPARAMS. As variáveis do consumidor das quais os valores dos parâmetros são obtidos e nas quais os valores dos parâmetros de saída são gravados são transmitidas em tempo de execução para ICommand::Execute na estrutura DBPARAMS. A estrutura DBPARAMS inclui três elementos:

    • Um ponteiro para o buffer do qual o provedor recupera dados de parâmetro de entrada e para o qual o provedor retorna dados de parâmetro de saída, de acordo com as associações especificadas pelo identificador do acessador.
    • O número de conjuntos de parâmetros no buffer.
    • O identificador do acessador criado na Etapa 3.
  5. Execute o comando usando ICommand::Execute.

Métodos usados para executar uma chamada a um procedimento armazenado

Ao executar um procedimento armazenado no SQL Server, o Driver do OLE DB para SQL Server dá suporte para:

  • Sequência de escape CALL do ODBC.
  • Sequência de escape RPC (Chamada de Procedimento Remoto).
  • Instrução EXECUTE do Transact-SQL.

Sequência de escape ODBC CALL

Se você souber informações de parâmetro, chame o método ICommandWithParameters::SetParameterInfo para descrever os parâmetros ao provedor. Caso contrário, quando a sintaxe ODBC CALL for usada na chamada de um procedimento armazenado, o provedor chamará uma função auxiliar para localizar as informações de parâmetros do procedimento armazenado.

Recomendamos usar a sintaxe ODBC CALL caso não seja possível determinar as informações dos parâmetros (metadados dos parâmetros).

A sintaxe geral para chamar um procedimento usando a sequência de escape ODBC CALL é:

{[?=]chamarprocedure_name[([parâmetro][,[parâmetro]]...)]}

Por exemplo:

{call SalesByCategory('Produce', '1995')}

Sequência de escape RPC

A sequência de escape RPC é semelhante à sintaxe ODBC CALL de chamar um procedimento armazenado. Ao executar várias vezes uma chamada ao procedimento, a sequência de escape RPC terá o desempenho mais adequado entre três modos possíveis de executar uma chamada a um procedimento armazenado.

Quando a sequência de escape RPC for usada para executar um procedimento armazenado, o provedor não executará uma chamada a funções auxiliares para determinar as informações dos parâmetros (conforme ocorre na sintaxe ODBC CALL). A sintaxe de RPC é mais simples que a sintaxe de ODBC CALL, assim o comando é analisado mais rápido, melhorando o desempenho. Neste caso, você precisa fornecer as informações de parâmetro executando ICommandWithParameters::SetParameterInfo.

A sequência de escape RPC exige que você tenha um valor de retorno. Caso o procedimento armazenado não retorne um valor, o servidor retornará 0 por padrão. Além disso, não será possível abrir um cursor SQL Server no procedimento armazenado. O procedimento armazenado é implicitamente preparado e a chamada a ICommandPrepare::Prepare falhará. Devido à impossibilidade de preparar uma chamada RPC, não será possível consultar metadados da coluna. Além disso, os métodos IColumnsInfo::GetColumnInfo e IColumnsRowset::GetColumnsRowset retornarão DB_E_NOTPREPARED.

Se você souber todos os metadados de parâmetro, a sequência de escape RPC será o modo recomendado para executar procedimentos armazenados.

Este SQL é um exemplo da sequência de escape RPC criada para executar uma chamada a um procedimento armazenado:

{rpc SalesByCategory}

Para um aplicativo de exemplo que demonstra uma sequência de escape RPC, confira Executar um procedimento armazenado (usando a sintaxe RPC) e processar códigos de retorno e parâmetros de saída (OLE DB).

Instrução EXECUTE do Transact-SQL

A sequência de escape ODBC CALL e a sequência de escape RPC são os métodos preferidos para chamar um procedimento armazenado no lugar da instrução EXECUTE. O Driver do OLE DB para SQL Server usa o mecanismo de RPC do SQL Server para otimizar o processamento do comando. O protocolo de RPC aumentará o desempenho eliminando grande parte do processamento de parâmetros e da análise de instruções executados no servidor.

O seguinte SQL é um exemplo da instrução EXECUTE do Transact-SQL:

EXECUTE SalesByCategory 'Produce', '1995'

Consulte também

Procedimentos armazenados