次の方法で共有


SQL Server への拡張ストアド プロシージャの追加

適用対象:SQL Server

重要

この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに CLR Integration を使用してください。

拡張ストアド プロシージャ関数を含む 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 の最初のパラメーターには、関数の名前を指定します。2 番目のパラメーターには、その関数が含まれている DLL の名前を指定します。 DLL の完全なパスを指定することをお勧めします。

重要

完全パスを使用して登録されなかった既存の DLL は、SQL Server 2005 以降へのアップグレード後に機能しなくなります。 この問題を修正するには、sp_dropextendedproc を使用して DLL の登録を解除し、sp_addextendedproc を使用して完全パスと共に登録し直します。

sp_addextendedproc に指定する関数の名前は、大文字と小文字の区別を含め、DLL 内の関数名とまったく同じにする必要があります。 たとえば、次のコマンドは、SQL Server 拡張ストアド プロシージャとして、dll xp_hello.dll内にある関数xp_hello,を登録します。

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

指定された関数の名前が DLL の sp_addextendedproc 関数名と正確に一致しない場合、新しい名前は SQL Server に登録されますが、名前は使用できません。 たとえば、SQL Server の拡張ストアド プロシージャとして登録されていますが xp_Hello 、後で xp_hello.dll関数を呼び出すために使用 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 インスタンスの照合順序で大文字と小文字が区別される場合、拡張ストアド プロシージャが DLL 内の関数とまったく同じ名前と照合順序で登録されている場合でも、SQL Server は拡張ストアド プロシージャを呼び出すことができません(プロシージャが別のケースで呼び出される場合)。

--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)