Condividi tramite


Creazione di stored procedure estese

Nota importanteImportante

Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Non utilizzare questa caratteristica in un nuovo progetto di sviluppo e modificare non appena possibile le applicazioni in cui è attualmente implementata. Utilizzare invece la funzionalità di integrazione CLR.

Una stored procedure estesa è una funzione con un prototipo:

SRVRETCODE xp_extendedProcName **(**SRVPROC *);

L'utilizzo del prefisso xp_ è facoltativo. I nomi delle stored procedure estese rispettano la distinzione tra maiuscole e minuscole quando vi si fa riferimento in istruzioni Transact-SQL, indipendentemente dalla tabella codici o dal tipo di 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 EXPORTS di un file con estensione def oppure è possibile anteporre __declspec(dllexport), un'estensione del compilatore Microsoft, al nome della funzione nel codice sorgente. 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 la DLL della stored procedure estesa non supporta __GetXpVersion(), viene stampato un messaggio di avviso, ossia Errore 8131: La DLL della stored procedure estesa '%' non consente l'esportazione di __GetXpVersion(),nel registro 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 registro errori viene stampato un messaggio di avviso indicante la versione restituita dalla funzione e la versione prevista dal server. La visualizzazione di questo messaggio indica la restituzione di un valore non corretto da __GetXpVersion() o 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 della DLL di una stored procedure estesa, copiare la DLL 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\MSSQL10_50.MSSQLSERVER\MSSQL\Binn\Sqlservr.exe. Per informazioni sugli argomenti vedere Applicazione sqlservr.