Criar procedimentos armazenados estendidos

Aplica-se a:SQL Server

Importante

Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam. Em vez disso, use a Integração CLR.

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

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

O uso do prefixo xp_ é opcional. Os nomes de procedimentos armazenados estendidos diferenciam maiúsculas de minúsculas quando referenciados 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 prefixar o nome da função no código-fonte com __declspec(dllexport), uma extensão do 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çã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 rastreamento -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 oferece suporte a __GetXpVersion(), uma mensagem de aviso (Erro 8131: DLL de procedimento armazenado estendido '%' não exporta __GetXpVersion().) é impresso 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 você receber essa mensagem, você está retornando um valor incorreto de __GetXpVersion(), ou você está compilando com uma versão mais antiga do srv.h.

Observação

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

Será 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 para o 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\MSSQL13. MSSQLSERVER\MSSQL\Binn\Sqlservr.exe). Para obter informações sobre argumentos sqlservr, consulte Aplicativo sqlservr.

Confira também

srv_got_attention (API do procedimento armazenado estendido)