Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
si applica a:SQL Server
Importante
Questa funzionalità verrà rimossa in una versione futura 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. Usa invece l'integrazione CLR .
Come funzionano le stored procedure estese
Il processo con cui funziona una procedura di memorizzazione estesa è:
Quando un client esegue una stored procedure estesa, la richiesta viene trasmessa in formato dataflow tabulare (TDS) o Simple Object Access Protocol (SOAP) dall'applicazione client a SQL Server.
SQL Server cerca la DLL associata alla stored procedure estesa e carica la DLL se non è già caricata.
SQL Server chiama la stored procedure estesa richiesta (implementata come funzione all'interno della DLL).
La stored procedure estesa trasferisce i set di risultati e i parametri di ritorno al server tramite l'API Extended Stored Procedure.
In passato, Open Data Services veniva utilizzato per scrivere applicazioni server, come gateway verso ambienti di database non SQL Server. SQL Server non supporta le parti obsolete dell'API Open Data Services. L'unica parte dell'API originale di Open Data Services ancora supportata da SQL Server sono le funzioni di stored procedure estese, quindi l'API fu rinominata Extended Stored Procedure API.
Con l'emergere delle query distribuite e dell'integrazione CLR, la necessità di applicazioni API Extended Stored Procedure è stata in gran parte sostituita.
Se hai già applicazioni gateway, non puoi usare quelle opends60.dll fornite con SQL Server per eseguire le applicazioni. Le applicazioni gateway non sono più supportate.
Stored procedure estese vs. integrazione CLR
L'integrazione CLR offre un'alternativa più robusta alla scrittura di logica lato server che era difficile da esprimere o impossibile da scrivere in Transact-SQL. Nelle versioni precedenti di SQL Server, le stored procedure estese (XP) fornivano l'unico meccanismo disponibile per gli sviluppatori di applicazioni di database per scrivere tale codice.
Con l'integrazione CLR, la logica che prima veniva scritta sotto forma di stored procedure è spesso meglio espressa come funzioni a valori di tabella, che permettono di interrogare i risultati costruiti dalla funzione in SELECT istruzioni incorporandoli nella FROM clausola.
Per ulteriori informazioni, vedi panoramica dell'integrazione CLR.
Caratteristiche di esecuzione delle stored procedure estese
L'esecuzione di una stored procedure estesa presenta queste caratteristiche:
La funzione di stored procedure estesa viene eseguita nel contesto di sicurezza di SQL Server.
La funzione stored procedure estesa viene eseguita nello spazio di processo di SQL Server.
Il thread associato all'esecuzione della stored procedure estesa è lo stesso usato per la connessione client.
Importante
Prima di aggiungere stored procedure estese al server e concedere permessi di esecuzione ad altri utenti, l'amministratore di sistema dovrebbe esaminare attentamente ogni stored procedure estesa per assicurarsi che non contenga codice dannoso o malevolo.
Dopo che la DLL stored procedure estesa è caricata, la DLL rimane caricata nello spazio degli indirizzi del server finché SQL Server non viene fermato o l'amministratore non scarica esplicitamente la DLL usando DBCC <DLL_name> (FREE).
La stored procedure estesa può essere eseguita da Transact-SQL come stored procedure utilizzando la dichiarazione EXECUTE :
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Parametri
@ Retval
Un valore di reso.
@ param1
Parametro di input.
@ param2
Un parametro di ingresso/uscita.
Attenzione
Le stored procedure estese offrono miglioramenti delle prestazioni ed estesi alle funzionalità di SQL Server. Tuttavia, poiché la DLL della stored procedure estesa e SQL Server condividono lo stesso spazio di indirizzi, una procedura problematica può influire negativamente sul funzionamento di SQL Server. Sebbene le eccezioni create dalla DLL della stored procedure estesa siano gestite da SQL Server, è possibile danneggiare le aree dati di SQL Server. Per precauzione di sicurezza, solo gli amministratori di sistema SQL Server possono aggiungere stored procedure estese a SQL Server. Queste procedure devono essere testate accuratamente prima di essere installate.
Invia set di risultati al server con l'API Extended Stored Procedure
Quando si invia un set di risultati a SQL Server, la stored procedure estesa dovrebbe chiamare l'API appropriata come segue:
La
srv_sendmsgfunzione può essere chiamata in qualsiasi ordine prima o dopo che tutte le righe (se ce ne sono) sono consrv_sendrow. Tutti i messaggi devono essere inviati al client prima che lo stato di completamento venga inviato consrv_senddone.La
srv_sendrowfunzione viene chiamata una volta per ogni riga inviata al client. Tutte le righe devono essere inviate al client prima che vengano inviati messaggi, valori di stato o stati di completamento consrv_sendmsg, l'argomentosrv_statusdisrv_pfield, osrv_senddone.Inviare una riga che non ha tutte le sue colonne definite
srv_describefa sì che l'applicazione generi un messaggio di errore informativo e torniFAILal client. In questo caso, la riga non viene inviata.
Crea stored procedure estese
Una stored procedure estesa è una funzione C/C++ con un prototipo:
SRVRETCODE xp_extendedProcName (SRVPROC *);
L'uso del prefisso xp_ è opzionale. I nomi di stored procedure estesi sono sensibili alla maiuscola e minuscole quando vengono citati in Transact-SQL istruzioni, indipendentemente dalla code page/ordine di ordinamento installato sul server. Quando costruisci una DLL:
Se è necessario un punto di ingresso, scrivi una
DllMainfunzione.Questa funzione è facoltativa. Se non lo fornisci in codice sorgente, il compilatore collega la propria versione, che non fa altro che restituire
TRUE. Se fornisci unaDllMainfunzione, il sistema operativo chiama questa funzione quando un thread o un processo si collega o si stacca dalla DLL.Tutte le funzioni chiamate dall'esterno della DLL (tutte le Efunctions della stored procedure estesa) devono essere esportate.
Puoi esportare una funzione elencandone il nome nella
EXPORTSsezione di un.deffile, oppure puoi prefissare il nome della funzione nel codice sorgente con__declspec(dllexport), un'estensione del compilatore Microsoft (__declspec()inizia con due sottoline).
Questi file sono necessari per creare una DLL di stored procedure estesa.
| File | Description |
|---|---|
srv.h |
File di header API Extended Stored Procedure |
opends60.lib |
Libreria di importazione per opends60.dll |
Per creare una DLL di stored procedure estesa, crea un progetto di tipo Dynamic Link Library. Per maggiori informazioni sulla creazione di una DLL, consulta la documentazione dell'ambiente di sviluppo.
Tutte le DLL stored procedure estese dovrebbero implementare ed esportare la seguente funzione:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) è un'estensione di compilatore specifica di Microsoft. Se il tuo compilatore non supporta questa direttiva, dovresti esportare questa funzione nel file DEF sotto la EXPORTS sezione.
Quando SQL Server viene avviato con il flag -T260 di tracciamento o se un utente con privilegi di amministratore di sistema esegue DBCC TRACEON (260), e se la DLL stored procedure estesa non supporta __GetXpVersion(), il seguente messaggio di avviso viene stampato nel log degli errori (__GetXpVersion() inizia con due sottoline).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Se la DLL della stored procedure estesa esporta __GetXpVersion(), ma la versione restituita dalla funzione è inferiore a quella richiesta dal server, un messaggio di avviso che indica la versione restituita dalla funzione e quella attesa dal server viene stampato nel registro errori. Se ricevi questo messaggio, stai restituendo un valore errato da __GetXpVersion(), oppure stai compilando con una versione più vecchia di srv.h.
Annotazioni
SetErrorMode, una funzione Win32, non dovrebbe essere chiamata nelle stored procedure estese.
Le stored procedure estese di lunga durata dovrebbero chiamare srv_got_attention periodicamente, in modo che la procedura possa terminare da sola se la connessione viene interrotta o se il batch viene abortito.
Per debugare una DLL di stored procedure estesa, copiala nella directory di SQL Server \Binn . Per specificare l'eseguibile della sessione di debug, inserisci il percorso e il nome del file del file eseguibile di SQL Server (ad esempio, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Per informazioni sugli sqlservr argomenti, vedi sqlservr Applicazione.
Aggiungi una stored procedure estesa a SQL Server
Una DLL che contiene funzioni stored procedure estese agisce come un'estensione di SQL Server. Per installare la DLL, si copia il file in una directory, come quella che contiene i file DLL standard di SQL Server (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn di default).
Dopo che la DLL della stored procedure estesa è stata copiata sul server, un amministratore di sistema SQL Server deve registrare su SQL Server ogni funzione della stored procedure estesa nella DLL. Questo avviene utilizzando la sp_addextendedproc procedura di archiviazione del sistema.
Importante
L'amministratore di sistema dovrebbe esaminare attentamente una stored procedure estesa per assicurarsi che non contenga codice dannoso o dannoso prima di aggiungerla al server e concedere permessi di esecuzione ad altri utenti. Convalidare tutti gli input utente. Non concatenare l'input dell'utente prima di averlo validato. Non eseguire mai un comando creato dall'input dell'utente non convalidato.
Il primo parametro di sp_addextendedproc specifica il nome della funzione, e il secondo parametro indica il nome della DLL in cui risiede quella funzione. Dovresti specificare il percorso completo della DLL.
Annotazioni
Le DLL esistenti che non erano registrate con un percorso completo non funzionano dopo l'aggiornamento a SQL Server 2005 (9.x) o a una versione successiva. Per risolvere il problema, si usa sp_dropextendedproc la registrazione della DLL, poi la riregistri specificando sp_addextendedproc, il percorso completo.
Il nome della funzione specificata in sp_addextendedproc deve essere esattamente lo stesso, incluso il caso, del nome della funzione nella DLL. Ad esempio, questo comando registra una funzione xp_hello, situata in un dll chiamata xp_hello.dll, come procedura di memoria 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 a quello nella DLL, il nuovo nome viene registrato in SQL Server, ma il nome non è utilizzabile. Ad esempio, anche se xp_Hello è registrato come stored procedure estese di SQL Server situato in xp_hello.dll, SQL Server non riesce a trovare la funzione nella DLL se la usi xp_Hello per chiamarla in seguito.
-- 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;
Ecco il messaggio di errore:
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 corrisponde sp_addextendedproc esattamente a quello nella DLL, e la collazione dell'istanza di SQL Server è indistinta a 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 example succeeds 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 la collazione dell'istanza SQL Server è distinta dalla maiuscola e minuscolo, SQL Server non può chiamare la stored procedure estesa se la procedura viene chiamata con una mazzeta diversa. Questo è vero anche se fosse registrato con esattamente lo stesso nome e collazione della funzione nella DLL.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example results in an error
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;
Ecco il messaggio di errore:
Server: Msg 2812, Level 16, State 62, Line 1
Non devi fermarti e riavviare SQL Server.
Consulta le stored procedure estese installate in SQL Server
Un utente autenticato con SQL Server può visualizzare le stored procedure estese attualmente definite e il nome della DLL a cui ciascuna appartiene eseguendo la sp_helpextendedproc procedura di sistema. Ad esempio, il seguente esempio restituisce la DLL a cui xp_hello appartiene:
sp_helpextendedproc 'xp_hello';
Se sp_helpextendedproc viene eseguito senza specificare una stored procedure estesa, tutte le stored procedure estese e le loro DLL vengono visualizzate.
Rimuovere una stored procedure estesa da SQL Server
Per eliminare ogni funzione di stored procedure estesa in una DLL di stored procedure estesa definita dall'utente, un amministratore di sistema SQL Server deve eseguire la sp_dropextendedproc stored procedure di sistema, specificando il nome della funzione e il nome della DLL in cui risiede quella funzione. Ad esempio, questo comando rimuove la funzione xp_hello, situata in una DLL chiamata xp_hello.dll, da SQL Server:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Non elimina le procedure di memoria estese del sistema. Invece, l'amministratore di sistema dovrebbe negare EXECUTE il permesso sulla procedura estesa memorizzata al ruolo pubblico .
Scarica una DLL di stored procedure estesa
SQL Server carica una DLL di stored procedure estesa non appena viene effettuata una chiamata a una delle funzioni della DLL. La DLL rimane carica finché il server non viene spento o finché l'amministratore di sistema non utilizza l'istruzione DBCC per scaricarla. Ad esempio, questo comando scarica il xp_hello.dll, permettendo all'amministratore di sistema di copiare una versione più recente di questo file nella directory senza spegnere il server:
DBCC xp_hello(FREE);
Contenuti correlati
- Integrazione di Common Language Runtime (CLR)
- Funzioni Table-Valued CLR
- Procedure Memorizzate Estese del Motore di Database - Programmazione
- Interrogazione delle procedure stored estese installate in SQL Server
- srv_got_attention (API Extended Stored Procedure)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- DLLNAME DLL (GRATUITO) (Transact-SQL)