CLR 統合の概要
このトピックでは、.NET Framework共通言語ランタイム (CLR) とのSQL Server統合を使用してデータベース オブジェクトをコンパイルするために必要な名前空間とライブラリの概要について説明します。 このトピックでは、簡単な CLR ストアド プロシージャを Microsoft Visual C# で作成し、コンパイルし、実行する方法についても説明します。
必要な名前空間
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
簡単な "Hello World" ストアド プロシージャの作成
次の Visual C# または Microsoft 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!";
}
}
Imports System
Imports System.Data
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlTypes
Imports System.Runtime.InteropServices
Public Class HelloWorldProc
<Microsoft.SqlServer.Server.SqlProcedure> _
Public Shared Sub HelloWorld(<Out()> ByRef text as String)
SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)
text = "Hello world!"
End Sub
End Class
この簡単なプログラムには、パブリック クラスの静的メソッドが 1 つ含まれています。 このメソッドでは、SqlContext
と SqlPipe
という 2 つの新しいクラスを使用して、簡単なテキスト メッセージを出力するマネージド データベース オブジェクトを作成します。 また、このメソッドでは、文字列 "Hello world!" を out パラメーターの値として割り当てます。 このメソッドは、Transact-SQL ストアド プロシージャのストアド プロシージャとして宣言できます。
次に、このプログラムをライブラリとしてコンパイルし、それを SQL Server に読み込み、ストアド プロシージャとして実行します。
"Hello World" ストアド プロシージャのコンパイル
既定では、Microsoft .NET Framework再配布ファイルです。 インストールされるファイルには、Visual C# プログラムと Visual Basic プログラム用のコマンド ライン コンパイラである csc.exe と vbc.exe が含まれています。 サンプルをコンパイルする前に、csc.exe または vbc.exe が格納されたディレクトリを指すようにパス変数を変更する必要があります。 .NET Framework の既定のインストール パスは、次のとおりです。
C:\Windows\Microsoft.NET\Framework\(version)
version は、インストールされた再配布可能な .NET Framework のバージョン番号を表します。 次に例を示します。
C:\Windows\Microsoft.NET\Framework\v2.0.31113
.NET Framework ディレクトリをパスに追加した後、次のコマンドを実行してサンプル ストアド プロシージャをアセンブリにコンパイルできます。 アセンブリへのコンパイルを可能にするのは /target
オプションです。
Visual C# ソース ファイルの場合は、次のコマンドを実行します。
csc /target:library helloworld.cs
Visual Basic ソース ファイルの場合は、次のコマンドを実行します。
vbc /target:library helloworld.vb
これらのコマンドでは、/target オプションを使用してライブラリ DLL をビルドすることを指定し、Visual C# コンパイラまたは Visual Basic コンパイラを起動します。
"Hello World" ストアド プロシージャの SQL Server への読み込みと実行
サンプル プロシージャが正常にコンパイルされたら、SQL Server Management Studioでテストし、適切なテスト データベース (AdventureWorks サンプル データベースなど) に接続して新しいクエリを作成できます。
共通言語ランタイム (CLR) コードを実行する機能は、SQL Serverでは既定で 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
-- 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
参照
CLR ストアド プロシージャ
ADO.NET に対する SQL Server インプロセス固有の拡張機能
CLR データベース オブジェクトのデバッグ
CLR 統合のセキュリティ