Adicionando um procedimento armazenado estendido ao SQL Server

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.

Uma DLL que contém funções de procedimento armazenado estendidas atua como uma extensão para o SQL Server. Para instalar a DLL, copie o arquivo para um diretório, como aquele que contém os arquivos DLL padrão do SQL Server (C:\Arquivos de Programas\Microsoft SQL Server\MSSQL12.0.x\MSSQL\Binn por padrão).

Depois que a DLL de procedimento armazenado estendido tiver sido copiada para o servidor, um administrador de sistema do SQL Server deverá registrar no SQL Server cada função de procedimento armazenado estendido na DLL. Isso é feito por meio do uso do procedimento armazenado de sistema sp_addextendedproc.

Importante

O administrador do sistema deve examinar inteiramente um procedimento armazenado estendido para garantir que ele não contenha código perigoso ou mal-intencionado, antes de adicioná-lo ao servidor e conceder permissões de execução a outros usuários. Valide todas as entradas de usuário. Não concatene uma entrada de usuário antes de validá-la. Nunca execute um comando construído por uma entrada de usuário inválida.

O primeiro parâmetro de sp_addextendedproc especifica o nome da função e o segundo, o nome da DLL em que reside essa função. É recomendável especificar o caminho completo da DLL.

Importante

As DLLs existentes que não foram registradas com um caminho completo não funcionarão depois da atualização para o SQL Server 2005 ou posterior. Para corrigir o problema, use sp_dropextendedproc para cancelar o registro da DLL e registrá-la novamente com sp_addextendedproc, especificando o caminho completo.

O nome da função especificada em sp_addextendedproc deve ser exatamente igual, inclusive maiúsculas e minúsculas, ao nome da função na DLL. Por exemplo, esse comando registra uma função xp_hello, localizada em uma dll chamada xp_hello.dll, como um procedimento armazenado estendido do SQL Server:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';  

Se o nome da função especificada em sp_addextendedproc não corresponder exatamente ao nome da função na DLL, o novo nome será registrado no SQL Server, mas o nome não será utilizável. Por exemplo, embora xp_Hello esteja registrado como um procedimento armazenado estendido do SQL Server localizado no xp_hello.dll, o SQL Server não poderá localizar a função na DLL se você usar xp_Hello para chamar a função posteriormente.

--Register the function (xp_hello) with an initial upper case  
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll';  
  
--Use the newly registered name to call the function  
DECLARE @txt varchar(33);  
EXEC xp_Hello @txt OUTPUT;  
  
--This is the error message  
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1  
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).  

Se o nome da função especificada em sp_addextendedproc corresponder exatamente ao nome da função na DLL e o agrupamento da instância do SQL Server não diferenciar maiúsculas de minúsculas, o usuário poderá chamar o procedimento armazenado estendido usando qualquer combinação de letras minúsculas e maiúsculas do nome.

--Register the function (xp_hello)  
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';  
  
--The following will succeed in calling xp_hello  
DECLARE @txt varchar(33);  
EXEC xp_Hello @txt OUTPUT;  
  
DECLARE @txt varchar(33);  
EXEC xp_HelLO @txt OUTPUT;  
  
DECLARE @txt varchar(33);  
EXEC xp_HELLO @txt OUTPUT;  

Quando o agrupamento da instância do SQL Server diferencia maiúsculas de minúsculas, o SQL Server não poderá chamar o procedimento armazenado estendido -- mesmo que ele tenha sido registrado exatamente com o mesmo nome e agrupamento que a função na DLL -- se o procedimento for chamado com um caso diferente.

--Register the function (xp_hello)  
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';  
  
--The following will result in an error  
DECLARE @txt varchar(33);  
EXEC xp_HELLO @txt OUTPUT;  
  
--This is the error  
Server: Msg 2812, Level 16, State 62, Line 1  

Não é necessário parar e reiniciar o SQL Server.

Confira também

sp_addextendedproc (Transact-SQL)
sp_dropextendedproc (Transact-SQL)