Compartilhar via


Criando procedimentos armazenados estendidos

Observação importanteImportante

Esse recurso será removido em uma versão futura do Microsoft SQL Server. Não utilize esse recurso em desenvolvimentos novos e modifique, assim que possível, os aplicativos que atualmente o utilizam. Em vez disso, use a integração CLR.

Um procedimento armazenado estendido é uma função com um protótipo:

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

O uso do prefixo xp_ é opcional. Os nomes de procedimento armazenado estendido fazem distinção de maiúsculas e minúsculas quando mencionados em instruções Transact-SQL, independentemente da página de código/ordem de classificação instalada no servidor. Quando você compila uma DLL:

  • Se um ponto de entrada for necessário, grave uma função DllMain.

    Essa função será opcional; se você não a fornecer em código-fonte, o compilador vinculará sua própria versão, o que não resultará em nada, mas retornará TRUE. Se você fornecer uma função DllMain, o sistema operacional chamará essa função quando um thread ou processo for anexado ou desanexado da DLL.

  • Todas as funções chamadas de fora da DLL (todas as Efunctions do procedimento armazenado estendido) devem ser exportadas.

    Você pode exportar uma função listando seu nome na seção EXPORTS de um arquivo .def ou pode atribuir __declspec(dllexport) como prefixo no nome da função no código-fonte, uma extensão de compilador da Microsoft (observe que __declspec() começa com dois sublinhados).

Estes arquivos são necessários para criar uma DLL de procedimento armazenado estendido.

Arquivo

Descrição

Srv.h

Arquivo de cabeçalho da API do Procedimento Armazenado Estendido

Opends60.lib

Biblioteca de importação para Opends60.dll

Para criar uma DLL de procedimento armazenado estendido, crie um projeto do tipo Biblioteca de Vínculo Dinâmico. Para obter mais informações sobre a criação de uma DLL, consulte a documentação do ambiente de desenvolvimento.

É altamente recomendado que todas as DLLs de procedimento armazenado estendido implementem e exportem a seguinte função:

__declspec(dllexport) ULONG __GetXpVersion()
{
   return ODS_VERSION;
}
ObservaçãoObservação

__declspec(dllexport) é uma extensão de compilador específica da Microsoft. Se seu compilador não aceitar esta diretiva, você deverá exportar esta função no arquivo DEF, na seção EXPORTS.

Quando o SQL Server é iniciado com o sinalizador de rastreio -T260 ou se um usuário com privilégios de administrador do sistema executa DBCC TRACEON (260), e se a DLL de procedimento armazenado estendido não aceita __GetXpVersion(), uma mensagem de aviso (Erro 8131: A DLL de procedimento armazenado estendido '%' não exporta __GetXpVersion().) é impressa no log de erros. (Observe que __GetXpVersion () começa com dois sublinhados.)

Se a DLL de procedimento armazenado estendido exportar __GetXpVersion(), mas a versão retornada pela função for menor que aquela exigida pelo servidor, uma mensagem de aviso informando a versão retornada pela função e a versão esperada pelo servidor será impressa no log de erros. Se essa mensagem for exibida, você estará retornando um valor incorreto de __GetXpVersion () ou estará compilando com uma versão mais antiga de srv.h.

ObservaçãoObservação

SetErrorMode, uma função do Microsoft Win32, não deve ser chamada em procedimentos armazenados estendidos.

É recomendável que um procedimento armazenado estendido de execução demorada chame srv_got_attention periodicamente, de forma que o procedimento possa ser encerrado por si mesmo se a conexão for interrompida ou o lote for anulado.

Para depurar uma DLL de procedimento armazenado estendido, copie-a no diretório SQL Server\Binn. Para especificar o executável para a sessão de depuração, insira o caminho e o nome do arquivo executável do Microsoft SQL Server (por exemplo, C:\Arquivos de Programas\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\Sqlservr.exe). Para obter informações sobre argumentos sqlservr, consulte Aplicativo sqlservr.

Consulte também

Referência

srv_got_attention (API do procedimento armazenado estendido)