次の方法で共有


SQL Server 言語拡張で .NET ランタイムを呼び出す方法

適用対象: SQL Server 2019 (15.x) 以降のバージョン

SQL Server 言語拡張機能は、.NET ランタイムを呼び出すインターフェイスとして sp_execute_external_script システム ストアド プロシージャを使用します。

このハウツー記事では、SQL Server 上で実行される C# コードの実装について詳しく説明します。

C# クラスの配置場所

SQL Server で C# コードを呼び出す場合は、外部ライブラリ DDL を使用して、コンパイルされた .NET ライブラリ (DLL) やその他の依存関係をデータベースにアップロードします。 詳細については、「C# プロジェクトから .NET DLL を作成する」を参照してください。

基本原則

SQL Server で C# を実行する場合の基本的な原則を次に示します。

  • コンパイルされたカスタム .NET クラスは、DLL ファイルに存在する必要があります。

  • 呼び出している C# メソッドは、ストアド プロシージャの script パラメーターで指定する必要があります。

  • クラスがパッケージに属している場合は、packageName を提供する必要があります。

  • params は、C# クラスにパラメーターを渡すために使用されます。 引数を必要とするメソッドの呼び出しはサポートされていません。 そのため、引数の値をメソッドに渡すには、パラメーターが唯一の方法です。

Note

このメモでは、SQL Server 2019 (15.x) 以降のバージョンの C# に固有のサポートされている操作とサポートされていない操作について改めて説明します。 ストアド プロシージャでは、入力パラメーターがサポートされていますが、出力パラメーターはサポートされていません。

C# コードの呼び出し

sp_execute_external_script システム ストアド プロシージャは、.NET ランタイムの呼び出しに使用されるインターフェイスです。 .NET 拡張を使用する sp_execute_external_script と、パス、スクリプト、およびカスタム コードを指定するパラメーターの例を次に示します。

Note

どのメソッドを呼び出すかを定義する必要はありません。 デフォルトでは、Execute というメソッドが呼び出されます。 これは、SQL Server 用の Microsoft Extensibility SDK for C# に従い、C# クラスに Execute メソッドを実装する必要があることを意味します。

DECLARE @param1 INT;

SET @param1 = 3;

EXEC sp_execute_external_script
    @language = N'dotnet',
    @script = N'<PackageName>.<ClassName>',
    @input_data_1 = N'<Input Query>',
    @param1 = @param1;

外部ライブラリを使用する

SQL Server 2019 (15.x) 以降のバージョンでは、Windows 上の C# 言語の外部ライブラリを使用できます。 CREATE EXTERNAL LIBRARY DDL を使用して、クラスを DLL ファイルにコンパイルし、DLL とその他の依存関係をデータベースにアップロードできます。

外部ライブラリを使用して DLL ファイルをアップロードする方法の例:

CREATE EXTERNAL LIBRARY [dotnetlibrary]
FROM (CONTENT = '<local path to .dll file>')
WITH (LANGUAGE = 'dotnet');
GO

外部ライブラリを作成すると、SQL Server は自動的に C# クラスにアクセスできるようになり、パスに特別なアクセス許可を設定する必要はありません。

次のコードは、外部ライブラリとしてアップロードされた MyPackage パッケージから MyClass クラス内の Execute メソッドを呼び出す例です。

EXEC sp_execute_external_script
    @language = N'dotnet',
    @script = N'MyPackage.MyClass',
    @input_data_1 = N'SELECT * FROM MYTABLE'
WITH RESULT SETS((column1 INT));

詳細については、「CREATE EXTERNAL LIBRARY」を参照してください。