Creare stored procedure estese

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 stored procedure estesa è una funzione C/C++ con un prototipo:

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

L'utilizzo del prefisso xp_ è facoltativo. I nomi delle stored procedure estese fanno distinzione tra maiuscole e minuscole quando si fa riferimento nelle istruzioni Transact-SQL, indipendentemente dalla tabella codici o dall'ordinamento installato nel server. Quando si compila una DLL:

  • Se è necessario un punto di ingresso, scrivere una funzione DllMain.

    Questa funzione è facoltativa e, se non viene specificata nel codice sorgente, il compilatore collega la propria versione, che si limita a restituire TRUE. Se si specifica una funzione DllMain, il sistema operativo chiama questa funzione quando un thread o un processo viene collegato alla DLL o scollegato dalla DLL.

  • Tutte le funzioni chiamate dall'esterno della DLL, ovvero tutte le funzioni Efunction delle stored procedure estese, devono essere esportate.

    È possibile esportare una funzione elencandone il nome nella sezione EXPORT di un file con estensione def oppure è possibile anteporre il nome della funzione nel codice sorgente con __declspec(dllexport), un'estensione del compilatore Microsoft (si noti che __declspec() inizia con due caratteri di sottolineatura.

I file seguenti sono necessari per la creazione della DLL di una stored procedure estesa.

File Descrizione
Srv.h File di intestazione dell'API della stored procedure estesa
Opends60.lib Libreria di importazione per Opends60.dll

Per creare la DLL di una stored procedure estesa, creare un progetto di tipo DLL. Per ulteriori informazioni sulla creazione di una DLL, vedere la documentazione dell'ambiente di sviluppo.

È estremamente consigliabile fare in modo che tutte le DLL delle stored procedure estese implementino ed esportino la funzione seguente:

__declspec(dllexport) ULONG __GetXpVersion()  
{  
   return ODS_VERSION;  
}  

Nota

__declspec(dllexport) è un'estensione del compilatore specifica di Microsoft. Se il compilatore non supporta questa direttiva, è necessario esportare questa funzione all'interno della sezione EXPORTS nel file DEF.

Quando SQL Server viene avviato con il flag di traccia -T260 o se un utente con privilegi di amministratore di sistema esegue DBCC TRACEON (260) e se la DLL della stored procedure estesa non supporta __GetXpVersion(), un messaggio di avviso (Errore 8131: DLL della stored procedure estesa '%' non esporta __GetXpVersion().) viene stampato nel log degli errori. Si noti che __GetXpVersion() inizia con due caratteri di sottolineatura.

Se la DLL della stored procedure estesa consente l'esportazione di __GetXpVersion() ma la versione restituita dalla versione è precedente rispetto a quella richiesta dal server, nel log degli errori viene stampato un messaggio di avviso indicante la versione restituita dalla funzione e la versione prevista dal server. Se viene visualizzato questo messaggio, si restituisce un valore non corretto da __GetXpVersion() o si esegue la compilazione con una versione precedente di srv.h.

Nota

SetErrorMode, una funzione Microsoft Win32, non deve essere chiamata nelle stored procedure estese.

Una stored procedure estesa con esecuzione prolungata deve piuttosto chiamare srv_got_attention periodicamente in modo che la procedura possa terminare se stessa in caso di interruzione della connessione o del batch.

Per eseguire il debug di una DLL di stored procedure estesa, copiarla nella directory SQL Server\Binn. Per specificare il file eseguibile per la sessione di debug, immettere il percorso e il nome del file eseguibile di Microsoft SQL Server, ad esempio C:\Programmi\Microsoft SQL Server\MSSQL13. MSSQL edizione Standard RVER\MSSQL\Binn\Sqlservr.exe). Per informazioni sugli argomenti sqlservr, vedere sqlservr Application.

Vedi anche

srv_got_attention (API Stored procedure estesa)