CLR 統合を開始する

適用対象:SQL Server

この記事では、Microsoft SQL Server と .NET Framework 共通言語ランタイム (CLR) の統合を使用してデータベース オブジェクトをコンパイルするために必要な名前空間とライブラリの概要について説明します。 また、Microsoft Visual C# および Visual Basic を使用した小さな CLR ストアド プロシージャを記述、コンパイル、および実行する方法についても説明します。

必要な名前空間

基本的な CLR データベース オブジェクトの開発に必要なコンポーネントは、SQL Server と共にインストールされます。 CLR 統合機能は、.NET Framework の一部である System.Data.dll というアセンブリで公開されます。 このアセンブリは、.NET Framework ディレクトリ内だけでなく、GAC (グローバル アセンブリ キャッシュ) 内にもあります。 通常、このアセンブリへの参照は、コマンド ライン ツールと Microsoft Visual Studio の両方で自動的に追加されるので、手動で追加する必要はありません。

System.Data.dll アセンブリには、CLR データベース オブジェクトのコンパイルに必要な次の名前空間が含まれています。

  • System.Data
  • System.Data.Sql
  • Microsoft.SqlServer.Server
  • System.Data.SqlTypes

ヒント

Linux での CLR データベース オブジェクトの読み込みはサポートされていますが、.NET Framework を使用してビルドする必要があります (SQL Server CLR 統合では 、.NET Core または .NET 5 以降のバージョンはサポートされていません)。 また、EXTERNAL_ACCESS または UNSAFE アクセス許可セットを持つ CLR アセンブリは、Linux ではサポートされていません。

"Hello World" ストアド プロシージャを記述する

次の Visual C# コードまたは Visual Basic コードをコピーしてテキスト エディターに貼り付け、helloworld.cs または helloworld.vb というファイル名を付けて保存してください。

using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
  
public class HelloWorldProc
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void HelloWorld(out string text)
    {
        SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);
        text = "Hello world!";
    }
}

このプログラムには、パブリック クラスの静的メソッドが 1 つ含まれています。 このメソッドでは、SqlContextSqlPipe という 2 つの新しいクラスを使用して、短いテキスト メッセージを出力するマネージド データベース オブジェクトを作成します。 このメソッドでは、パラメーターの値 out として文字列 "Hello world!" も割り当てられます。 このメソッドをSQL Server のストアド プロシージャとして宣言すれば、Transact-SQL ストアド プロシージャと同じ方法で実行できます。

このプログラムをライブラリとしてコンパイルし、SQL Server に読み込んで、ストアド プロシージャとして実行します。

"Hello World" ストアド プロシージャをコンパイルする

SQL Server では、.NET Framework の再配布ファイルが既定でインストールされます。 これらのファイルには、Visual C# プログラムと Visual Basic プログラム用のコマンド ライン コンパイラである csc.exevbc.exe が含まれています。 サンプルをコンパイルする前に、csc.exe または vbc.exe が格納されたディレクトリを指すようにパス変数を変更する必要があります。 次のパスは、.NET Framework の既定のインストール パスです。

C:\Windows\Microsoft.NET\Framework\(version)

Version は、インストールされた .NET Framework のバージョン番号を表します。 次に例を示します。

C:\Windows\Microsoft.NET\Framework\v4.8.0

.NET Framework ディレクトリをパスに追加した後、次のコマンドを実行してサンプル ストアド プロシージャをアセンブリにコンパイルできます。 アセンブリへのコンパイルを可能にするのは /target オプションです。

Visual C# ソース ファイルの場合は、次のコマンドを実行します。

csc /target:library helloworld.cs

Visual Basic ソース ファイルの場合は、次のコマンドを実行します。

vbc /target:library helloworld.vb

これらのコマンドでは、/target オプションを使用してライブラリ DLL をビルドすることを指定し、Visual C# コンパイラまたは Visual Basic コンパイラを起動します。

SQL Server に "Hello World" ストアド プロシージャを読み込んで実行する

サンプル プロシージャを正常にコンパイルしたら、SQL Server でそのプロシージャをテストできます。 プロシージャをテストするには、SQL Server Management Studio を起動し、適切なテスト データベース (AdventureWorks サンプル データベースなど) に接続して新しいクエリを作成します。

SQL Server では、CLR (共通言語ランタイム) コードを実行する機能は、既定では OFF に設定されています。 CLR コードは、sp_configure システム ストアド プロシージャを使用して有効にすることができます。 詳細については、「CLR 統合の有効化」を参照してください。

ストアド プロシージャにアクセスするには、アセンブリを作成する必要があります。 この例では、helloworld.dll ディレクトリに C:\ アセンブリが作成されているものとします。 クエリに次の Transact-SQL ステートメントを追加します。

CREATE ASSEMBLY helloworld from 'C:\helloworld.dll' WITH PERMISSION_SET = SAFE

アセンブリを作成した後、次のように CREATE PROCEDURE ステートメントを使用すると、HelloWorld メソッドにアクセスできるようになります。 ここではストアド プロシージャ hello を呼び出します。

CREATE PROCEDURE hello
@i nchar(25) OUTPUT
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;
-- if the HelloWorldProc class is inside a namespace (called MyNS),
-- the last line in the create procedure statement would be
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld

作成したプロシージャは、Transact-SQL で記述された通常のストアド プロシージャと同様に実行できます。 次のコマンドを実行します。

DECLARE @J NCHAR(25);
EXEC hello @J out;
PRINT @J;

これにより、SQL Server Management Studio のメッセージ ウィンドウに次の出力結果が表示されます。

Hello world!
Hello world!

"Hello World" サンプル ストアド プロシージャを削除する

サンプル ストアド プロシージャの実行を完了したら、テスト データベースからこのプロシージャとアセンブリを削除できます。

最初に、次のように drop procedure コマンドを使用してプロシージャを削除します。

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')
   DROP PROCEDURE hello;

プロシージャを削除したら、サンプル コードが含まれたアセンブリを次のように削除できます。

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')
   DROP ASSEMBLY helloworld;

次のステップ

SQL Server での CLR の統合の詳細については、次の記事を参照してください。