建立擴充預存程序
重要事項 |
---|
未來的 Microsoft SQL Server 版本將移除這項功能。請勿在新的開發工作中使用此功能,並且儘速修改使用此功能的應用程式。請改用 CLR 整合。 |
擴充預存程序是包含原型的函數:
SRVRETCODE xp_extendedProcName **(**SRVPROC *);
使用前置詞 xp_ 是選擇性的。在 Transact-SQL 陳述式中參考時,無論安裝在伺服器上的字碼頁/排序次序為何,擴充預存程序名稱都會區分大小寫。當您建立 DLL 時:
如果需要進入點,撰寫 DllMain 函數。
此函數是選擇性的;如果您在原始程式碼中沒有提供此函數,編譯器會連結其自己的版本,這個版本只會傳回 TRUE。如果您提供 DllMain 函數,當執行緒或處理序附加到 DLL 或從 DLL 卸離時,作業系統會呼叫此函數。
系統必須匯出從 DLL 外部呼叫的所有函數 (所有擴充預存程序函數)。
您可以在 .def 檔的 EXPORTS 區段列出函數名稱來匯出該函數,或者您可以在原始程式碼中,透過 __declspec(dllexport) (Microsoft 編譯器副檔名 (請注意,__declspec() 的開頭為兩個底線)) 的方式,為函數名稱加上前置詞。
建立擴充預存程序 DLL 時需要這些檔案。
檔案 |
描述 |
---|---|
Srv.h |
擴充預存程序 API 標頭檔案 |
Opends60.lib |
Opends60.dll 的匯入程式庫 |
若要建立擴充預存程序 DLL,建立動態連結程式庫類型的專案。如需有關建立 DLL 的詳細資訊,請參閱開發環境文件集。
強烈建議您所有擴充預存程序 DLL 都實作並匯出下列函數:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
[!附註]
__declspec (dllexport) 是 Microsoft 專用的編譯器副檔名。如果您的編譯器不支援此指示詞,您應該在 DEF 檔案的 EXPORTS 區段下匯出這個函數。
當 SQL Server 的開頭為追蹤旗標 -T260 時,或者如果具備系統管理員權限的使用者執行 DBCC TRACEON (260),而且如果擴充預存程序 DLL 不支援 __GetXpVersion(),就會將警告訊息 (錯誤 8131: 擴充預存程序 DLL '%' 並未匯出 __GetXpVersion())列印到錯誤記錄檔中 (請注意,__GetXpVersion() 的開頭為兩個底線)。
如果擴充預存程序 DLL 匯出 __GetXpVersion(),但是函數所傳回的版本低於伺服器所需要的版本,敘述函數所傳回之版本以及伺服器所需之版本的警告訊息就會列印到錯誤記錄檔中。如果出現這個訊息,您就會從 __GetXpVersion() 傳回不正確的值,或者您會使用舊版的 srv.h 進行編譯。
[!附註]
SetErrorMode 是 Microsoft Win32 函數,不應該在擴充預存程序中呼叫。
建議長時間執行的擴充預存程序應該定期呼叫 srv_got_attention,讓該程序可以在連接遭到清除或批次遭到中止時自行結束。
若要為擴充預存程序 DLL 偵錯,將其複製到 SQL Server\Binn 目錄。若要指定偵錯工作階段的可執行檔,請輸入 MicrosoftSQL Server 可執行檔的路徑和檔案名稱 (例如,C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\Sqlservr.exe)。如需有關 sqlservr 引數的詳細資訊,請參閱<sqlservr 應用程式>。