このトピックでは、SQL Server と .NET Framework 共通言語ランタイム (CLR) の統合を使用してデータベース オブジェクトをコンパイルするために必要な名前空間とライブラリの概要について説明します。 このトピックでは、Microsoft Visual C# で記述された単純な CLR ストアド プロシージャを記述、コンパイル、実行する方法についても説明します。
必要な名前空間
SQL Server 以降。 CLR 統合機能は、.NET Framework の一部である system.data.dllというアセンブリで公開されます。 このアセンブリは、グローバル アセンブリ キャッシュ (GAC) と .NET Framework ディレクトリにあります。 通常、このアセンブリへの参照はコマンド ライン ツールと 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 つの新しいクラスを使用します。 このメソッドでは、out パラメーターの値として文字列 "Hello world!" も割り当てられます。 このメソッドは、ストアド プロシージャ内のストアド プロシージャ Transact-SQL 宣言できます。
次に、このプログラムをライブラリとしてコンパイルし、SQL Server に読み込み、ストアド プロシージャとして実行します。
"Hello World" ストアド プロシージャのコンパイル
既定では、Microsoft .NET Framework 再配布ファイル。 これらのファイルには、csc.exe と vbc.exe、Visual C# および Visual Basic プログラムのコマンド ライン コンパイラが含まれます。 サンプルをコンパイルするには、csc.exe または vbc.exeを含むディレクトリを指すようにパス変数を変更する必要があります。 .NET Framework の既定のインストール パスを次に示します。
C:\Windows\Microsoft.NET\Framework\(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 オプションを使用して Visual C# または Visual Basic コンパイラを起動し、ライブラリ DLL のビルドを指定します。
SQL Server での "Hello World" ストアド プロシージャの読み込みと実行
サンプル プロシージャが正常にコンパイルされたら、SQL Server Management Studio でテストし、新しいクエリを作成し、適切なテスト データベース (AdventureWorks サンプル データベースなど) に接続できます。
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 プロシージャ ステートメントを使用して 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 ストアド プロシージャ
SQL Server In-Process ADO.NET に対する特定の拡張機能
CLR データベース オブジェクトのデバッグ
CLR 統合のセキュリティ