Condividi tramite


Aggiunta di una stored procedure estesa a SQL Server

Si applica a:SQL Server

Importante

Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. Usare invece la funzionalità Integrazione CLR.

Una DLL che contiene funzioni stored procedure estese funge da estensione per SQL Server. Per installare la DLL, copiare il file in una directory, ad esempio quella che contiene i file DLL standard di SQL Server (C:\Programmi\Microsoft SQL Server\MSSQL12.0.x\MSSQL\Binn per impostazione predefinita).

Dopo che la DLL della stored procedure estesa è stata copiata nel server, un amministratore di sistema di SQL Server deve registrarsi a SQL Server ogni funzione stored procedure estesa nella DLL. È possibile eseguire questa operazione utilizzando la stored procedure di sistema sp_addextendedproc.

Importante

L'amministratore di sistema deve esaminare con attenzione una stored procedure estesa per assicurarsi che non contenga codice dannoso o malware prima di aggiungerla al server e prima di concedere autorizzazioni di esecuzione ad altri utenti. Convalidare sempre input di tutti gli utenti. Non concatenare l'input dell'utente prima di convalidarlo. Non eseguire mai un comando creato dall'input dell'utente non convalidato.

Il primo parametro di sp_addextendedproc specifica il nome della funzione, mentre il secondo specifica il nome della DLL nella quale risiede la funzione. È consigliabile specificare il percorso completo della DLL.

Importante

Le DLL esistenti non registrate con un percorso completo non funzionano dopo l'aggiornamento a SQL Server 2005 o versioni successive. Per correggere il problema, utilizzare sp_dropextendedproc per annullare la registrazione della DLL e quindi sp_addextendedproc per registrarla di nuovo specificando il percorso completo.

Il nome della funzione specificato in sp_addextendedproc deve corrispondere esattamente a quello presente nella DLL, anche nell'uso di maiuscole e minuscole. Ad esempio, questo comando registra una funzione xp_hello, che si trova in una DLL denominata xp_hello.dll, come stored procedure estesa di SQL Server:

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

Se il nome della funzione specificata in sp_addextendedproc non corrisponde esattamente al nome della funzione nella DLL, il nuovo nome verrà registrato in SQL Server, ma il nome non sarà utilizzabile. Ad esempio, anche se xp_Hello è registrato come stored procedure estesa di SQL Server che si trova in xp_hello.dll, SQL Server non sarà in grado di trovare la funzione nella DLL se si usa xp_Hello per chiamare la funzione in un secondo momento.

--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 il nome della funzione specificata in sp_addextendedproc corrisponde esattamente al nome della funzione nella DLL e le regole di confronto dell'istanza di SQL Server non fanno distinzione tra maiuscole e minuscole, l'utente può chiamare la stored procedure estesa usando qualsiasi combinazione di lettere minuscole e maiuscole del 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 le regole di confronto dell'istanza di SQL Server fa distinzione tra maiuscole e minuscole, SQL Server non sarà in grado di chiamare la stored procedure estesa, anche se è stata registrata con esattamente lo stesso nome e le regole di confronto della funzione nella DLL, se la routine viene chiamata con un caso diverso.

--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  

Non è necessario arrestare e riavviare SQL Server.

Vedi anche

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