建立擴充預存程式

適用於:SQL Server

重要

SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 CLR 整合。

擴充預存程式是具有原型的 C/C++ 函式:

SRVRETCODE xp_extendedProcName **(**SRVPROC *):

使用前置詞xp_是選擇性的。 在 Transact-SQL 語句中參考時,不論伺服器上安裝的代碼頁/排序順序為何,擴充預存程式名稱都會區分大小寫。 當您建置 DLL 時:

  • 如果需要進入點,請撰寫 DllMain 函式。

    此函式是選擇性的;如果您未在原始程式碼中提供,編譯程式會連結自己的版本,但不會傳回 TRUE。 如果您提供 DllMain 函式,當線程或進程附加至 DLL 或中斷連結時,作業系統會呼叫此函式。

  • 必須匯出從 DLL 外部呼叫的所有函式(所有擴充預存程式 Efunctions)。

    您可以在 .def 檔案的 EXPORT 區段中列出函式名稱,或者您可以在原始程式碼中加上__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 特定的編譯程式延伸模組。 如果您的編譯程式不支援此指示詞,您應該在 EXPORT 區段下的 DEF 檔案中匯出此函式。

當 SQL Server 以追蹤旗標 -T260 啟動,或具有系統管理員許可權的使用者執行 DBCC TRACEON (260),如果擴充預存程式 DLL 不支援__GetXpVersion()、警告訊息(錯誤 8131:擴充預存程式 DLL '%' 不會匯出__GetXpVersion()。 會列印至錯誤記錄檔。 (請注意,__GetXpVersion() 以兩個底線開頭。

如果擴充預存程式 DLL 匯出__GetXpVersion(),但函式傳回的版本小於伺服器所需的版本,則警告訊息指出函式所傳回的版本,而伺服器預期的版本會列印至錯誤記錄檔。 如果您收到此訊息,您會從 __GetXpVersion() 傳回不正確的值,或是使用舊版 srv.h 進行編譯。

注意

Microsoft Win32 函式 SetErrorMode 不應該在擴充預存程式中呼叫。

建議長時間執行的擴充預存程式應該定期呼叫 srv_got_attention,以便在聯機終止或批次中止時,程式可以自行終止。

若要偵錯擴充預存程式 DLL,請將它複製到 SQL Server\Binn 目錄。 若要指定偵錯會話的可執行檔,請輸入 Microsoft SQL Server 可執行檔的路徑和檔名(例如 C:\Program Files\Microsoft SQL Server\MSSQL13。MSSQLSERVER\MSSQL\Binn\Sqlservr.exe)。 如需 sqlservr 自變數的相關信息,請參閱 sqlservr Application

另請參閱

srv_got_attention (擴充預存程式 API)