ダイナミックリンク ライブラリ (dll) としてパッケージ化された拡張ストアドプロシージャを使用すると、Visual C++ を使用して開発された関数を通じて、SQL Server の機能を拡張することができます。 拡張ストアド プロシージャは、Dll 内の関数として実装されます。 拡張ストアド プロシージャでは、関数だけでなく、ユーザー定義型や集計関数 (SUM や AVG など) を定義することもできます。
クライアントが拡張ストアドプロシージャを実行すると、SQL Server は拡張ストアド プロシージャに関連付けられた dll を検索し、その dll を読み込みます。 SQL Server は、要求された拡張ストアド プロシージャを呼び出し、指定されたセキュリティ コンテキストでそれを実行します。 その後、拡張ストアド プロシージャは結果セットを渡し、パラメーターをサーバーに返します。
SQL Server では、検証可能なアセンブリを SQL Server にインストールできるようにするために、Transact-SQL (T-SQL) への拡張機能が提供されています。 セキュリティ コンテキストは、SQL Server のアクセス許可セットで指定されます。セキュリティ レベルは次のとおりです。
無制限モード: 自身のリスクでコードを実行します。コードは、検証可能なタイプセーフである必要はありません。
セーフ モード: /clr:safe を使用してコンパイルされた、検証可能なタイプセーフ コードを実行します。
重要
確認可能なプロジェクトの /clr:pure および /clr:safe の作成は、Visual Studio 2015 で非推奨になり、Visual Studio 2017 ではサポートされていません。 確認可能なコードが必要な場合は、コードを C# に変換することをお勧めします。
検証可能なアセンブリを作成して SQL Server に読み込むには、Transact-SQL コマンド CREATE ASSEMBLY および DROP ASSEMBLY を次のように使用します。
CREATE ASSEMBLY <assemblyName> FROM <'Assembly UNC Path'> WITH
PERMISSION_SET <permissions>
DROP ASSEMBLY <assemblyName>
PERMISSION_SET コマンドで、セキュリティ コンテキストを指定します。指定できる値は、UNRESTRICTED、SAFE、または EXTENDED です。
また、CREATE FUNCTION コマンドを使用して、クラス内のメソッド名にバインドすることもできます。
CREATE FUNCTION <FunctionName>(<FunctionParams>)
RETURNS returnType
[EXTERNAL NAME <AssemblyName>:<ClassName>::<StaticMethodName>]
例
次の SQL スクリプト (例として、"MyScript.sql" という名前が付けられています) は、SQL Server 内にアセンブリを読み込み、クラスのメソッドを使用できるようにします。
-- Create assembly without external access
drop assembly stockNoEA
go
create assembly stockNoEA
from
'c:\stockNoEA.dll'
with permission_set safe
-- Create function on assembly with no external access
drop function GetQuoteNoEA
go
create function GetQuoteNoEA(@sym nvarchar(10))
returns real
external name stockNoEA:StockQuotes::GetQuote
go
-- To call the function
select dbo.GetQuoteNoEA('MSFT')
go
SQL スクリプトは SQL クエリ アナライザーで対話的に実行することも、sqlcmd.exe ユーティリティを使用してコマンド ラインで実行することもできます。 次のコマンド ラインは、MyServer に接続し、既定のデータベースを使用し、信頼関係接続を使用し、MyScript.sql を入力し、MyResult.txt を出力します。
sqlcmd -S MyServer -E -i myScript.sql -o myResult.txt