Share via


將擴充預存程式新增至 SQL Server

適用於:SQL Server

重要

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

包含擴充預存程式函式的 DLL,可作為 SQL Server 的延伸模組。 若要安裝 DLL,請將檔案複製到目錄,例如包含標準 SQL Server DLL 檔案的檔案 (C:\Program Files\Microsoft SQL Server\MSSQL12.0。默認為 x\MSSQL\Binn。

將擴充預存程式 DLL 複製到伺服器之後,SQL Server 系統管理員必須在 DLL 中向 SQL Server 註冊每個擴充預存程式函式。 這會使用sp_addextendedproc系統預存程式來完成。

重要

系統管理員應該徹底檢閱擴充預存程式,以確保它不包含有害或惡意代碼,再將它新增至伺服器,並將執行許可權授與其他使用者。 驗證所有使用者輸入。 在驗證之前,請勿串連用戶輸入。 請勿執行由未經驗證之使用者輸入所建構的命令。

sp_addextendedproc的第一個參數會指定函式的名稱,而第二個參數會指定該函式所在的 DLL 名稱。 建議您指定 DLL 的完整路徑。

重要

升級至 SQL Server 2005 或更新版本之後,未向完整路徑註冊的現有 DLL 將無法運作。 若要修正此問題,請使用sp_dropextendedproc取消註冊 DLL,然後使用sp_addextendedproc重新註冊它,並指定完整路徑。

中指定的 sp_addextendedproc 函式名稱必須與 DLL 中的函式名稱完全相同,包括大小寫。 例如,此命令會將位於名為 xp_hello.dll的 dll 中的函xp_hello,式註冊為 SQL Server 擴充預存程式:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';  

如果 中指定的 sp_addextendedproc 函式名稱與 DLL 中的函式名稱不完全相符,新名稱將會在 SQL Server 中註冊,但名稱將無法使用。 例如,雖然 xp_Hello 註冊為 位於的 xp_hello.dllSQL Server 擴充預存程式,但如果您稍後使用 xp_Hello 呼叫函式,SQL Server 將無法在 DLL 中找到函式。

--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;  
  
--This is the error message  
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.).  

如果 中指定的 sp_addextendedproc 函式名稱完全符合 DLL 中的函數名稱,且 SQL Server 實例的定序不區分大小寫,則使用者可以使用名稱中小寫和大寫字母的任何組合來呼叫擴充預存程式。

--Register the function (xp_hello)  
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';  
  
--The following will succeed 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;  

當 SQL Server 實例的定序區分大小寫時,SQL Server 將無法呼叫擴充預存程式,即使它註冊的名稱和定序與 DLL 中的函式完全相同,如果以不同的大小寫呼叫程式。

--Register the function (xp_hello)  
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';  
  
--The following will result in an error  
DECLARE @txt varchar(33);  
EXEC xp_HELLO @txt OUTPUT;  
  
--This is the error  
Server: Msg 2812, Level 16, State 62, Line 1  

不需要停止並重新啟動 SQL Server。

另請參閱

sp_addextendedproc (Transact-SQL)
sp_dropextendedproc (Transact-SQL)