次の方法で共有


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 つ含まれています。 このメソッドでは、SqlContextSqlPipe という 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 統合のセキュリティ