次の方法で共有


CLR 統合を開始する

適用対象:SQL Server

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

必要な名前空間

基本的な CLR データベース オブジェクトの開発に必要なコンポーネントは、SQL Server と共にインストールされます。 CLR 統合機能は、.NET Framework の一部である System.Data.dll というアセンブリで公開されます。 このアセンブリは、グローバル アセンブリ キャッシュ (GAC) と .NET Framework ディレクトリにあります。 通常、このアセンブリへの参照はコマンド ライン ツールと 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" ストアド プロシージャを記述する

次の C# または Visual Basic .NET コードをコピーしてテキスト エディターに貼り付け、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 の再配布ファイルが既定でインストールされます。 これらのファイルには、csc.exevbc.exe、C# および Visual Basic .NET プログラムのコマンド ライン コンパイラが含まれます。 サンプルをコンパイルする前に、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 オプションです。

C# ソース ファイルの場合:

csc /target:library helloworld.cs

Visual Basic .NET ソース ファイルの場合:

vbc /target:library helloworld.vb

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

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

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

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

ストアド プロシージャにアクセスできるように、アセンブリを作成する必要があります。 この例では、C:\ ディレクトリに helloworld.dll アセンブリを作成したものとします。 クエリに次の 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;

手記

前の例では、HelloWorldProc クラスが名前空間 (MyNSと呼ばれます) 内にある場合、create プロシージャ ステートメントの最後の行は EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;されます。

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

DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;

予想される出力を次に示します。

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;