特集
SQL Server 2005の新機能「SQL CLR」(後編)

Visual Studio 2005でSQL CLRを実装してみる

中 博俊(Microsoft MVP 2005 - Visual C#)
2005/04/09
Page1 Page2 Page3 Page4

3. SQL CLRでHello World!を作成してみる

 今回はシンプルにSQL CLRプログラミングを体験してもらいたいので、SQL Serverネイティブ互換型を利用して、一番単純なスカラ値ユーザー定義関数のHello World!プログラム(以降、「Hello SQL CLR」)を作成してみよう。このプログラムは、単に「Hello SQL CLR」という文字列を返すだけのスカラ値ユーザー定義関数だ。

 実際のプログラムの作成からSQL Server 2005へ登録するまでの手順は次の図の流れに沿って行われるので、確認してほしい(この図は前回示したものと同じである)。

SQL CLRのDLLファイルをSQL Server 2005に登録するまでの流れ図
SQL CLRのDLLファイルをSQL Server 2005から呼び出し可能にするためには、そのDLLファイル(アセンブリ)をSQL Server 2005にあらかじめ登録しておく必要がある。
  SQL CLRプログラミングとコンパイル。通常のDLLファイルを作成するのと同様にコンパイルを行う。
  SQL Server 2005へのアセンブリの登録。出来上がったDLLファイルをデータベースに登録する。
  SQL Server 2005への関数の登録。登録したDLLファイルの呼び出し方法などを登録する。

 まずはSQL CLRのプログラムを作成してコンパイルしよう。

SQL CLRプログラミングとコンパイル

 SQL CLRプログラミングでは、通常の.NETプログラミングのMainメソッドと同じように、プログラムの実行開始位置(エントリポイント)となるメソッドを作成する。本稿の例では、HelloSqlClrというメソッドを作成した。具体的なコードは次のとおりだ。

using System;
using System.Data.Sql;
using System.Data.SqlTypes;

public class SQLCLR
{
  [SqlFunction]
  public static SqlString HelloSqlClr()
  {
    return "Hello SQL CLR";
  }
};
C#におけるSQL CLRのサンプル・プログラム(src.cs)
 
Imports System
Imports System.Data.Sql
Imports System.Data.SqlTypes

Partial Public Class SQLCLR
  <SqlFunction()> _
  Public Shared Function HelloSqlClr() As SqlString
    Return New SqlString("Hello SQL CLR")
  End Function
End Class
VBにおけるSQL CLRのサンプル・プログラム(src.vb)
HelloSqlClrというメソッドがプログラムの実行開始位置(エントリポイント)になる。この実行開始位置は、通常の.NETプログラムのMainメソッドと同じように静的メソッドである必要がある。このサンプル・プログラムは、“Hello SQL CLR”という文字列を呼び出し元に返しているだけである。

 SQL CLRでは名前空間を適用した静的メソッドを実行開始位置として登録することはできないので、名前空間の定義を誤って追加しないように注意しなければならない。

 またこのサンプル・プログラムでは、HelloSqlClrメソッドにSqlFunctionという属性が付けられているが、これによりこのメソッドがスカラ値ユーザー定義関数となる。この属性を付けていなくても単純なユーザー定義関数の場合には動作するが、(メソッドの内容を明示的にするためにも)必ず指定するようにしたい。このSqlFunctionなどの属性(ほかにもSqlProcedure属性やSqlUserDefinedType属性などがある)によりメソッドの役割はさまざまに変わってくるので、実際にSQL CLRでプログラミングを行う場合には、属性について必ずドキュメント(Visual Studio 2005に付属の「MSDNライブラリ」や、SQL Server 2005に付属の 「Books Online」など)を確認してほしい。

 SQL CLRプログラミングでString型を使う場合に、次の2つの方法がある。

1. .NETネイティブ型の「String型(System名前空間)」を利用する方法
(なおこのデータ型は、C#ではstring、VBではStringというように、それぞれプリミティブ型として別名が定義されている)

2. SQL Serverネイティブ互換型の「SqlString型(System.Data.SqlTypes名前空間)」を利用する方法

 前述したように、SQL Serverネイティブ互換型の方がパフォーマンスがよいので、本稿ではSqlString型を利用している。

 プログラムを作成できたらコンパイルしてみよう。

 コンパイル時には「sqlaccess.dll」の参照が必要となる(/r:オプション)。このファイルはSQL CLRプログラミングに必要なクラス・ライブラリが格納されているアセンブリである。また、出力ファイルはライブラリ(アセンブリ)として作成する(/t:libraryオプション)。

csc /t:library /r:"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\sqlaccess.dll" src.cs
src.csのコンパイル方法
 
vbc /t:library /r:"C:\Program Files\Microsoft Visual Studio 8\Common7\IDE\PublicAssemblies\sqlaccess.dll" src.vb
src.vbのコンパイル方法

 ここまでの作業でC#の場合でもVB.NETの場合でも、「src.dll」というSQL CLRプログラムのアセンブリ・ファイルが出来上がる。

 次にSQL Server 2005にこのアセンブリを登録しよう。

SQL Server 2005へのアセンブリの登録

 次にアセンブリをSQL Server 2005に登録するが、事前に「atmarkit」という名前のデータベースが作成されていることを前提とする(テーブルは追加しなくてよい)。

 なお、SQL Server 2000までの場合、コマンドラインでSQL Serverのオペレーションを行う場合には、「osql」というツールを利用していたが、SQL Server 2005では「sqlcmd」を利用する。sqlcmdの利用方法は、osqlとほぼ同じだ。

アセンブリを登録する流れ
SQL CLRのアセンブリを登録する作業は図のような流れで行う。
  sqlcmdツールでSQL Serverに接続する。
  接続した状態でアセンブリを登録する。

sqlcmdツールでSQL Server 2005に接続する

 まずは、sqlcmdツールにより次のようにしてSQL Server 2005に接続する。

C:\compile>sqlcmd -S (local) -E -d atmarkit

 このコマンドにより、同一マシン(=local)にあるSQL Serverインスタンス(-Sオプション)の、atmarkitというデータベース(-dオプション)に、Windows統合認証(-Eオプション)で、接続する。このSQL Serverへの接続設定は環境に依存するため、各自の環境に合わせて変更してほしい。

接続した状態でアセンブリを登録する

 sqlcmdツールでのアセンブリの登録は次のように行う。

create assembly HelloSQLCLRAssembly FROM 'c:\compile\src.dll' with permission_set=safe
go

 このコマンドでは、先ほど作成したアセンブリ(src.dll)を「HelloSQLCLRAssembly」という名前でセーフの権限セット(前編参照)を付与してSQL Server 2005へ登録している。なおこのコマンドを実行しても、特にその実行結果が出力されるわけではない。

 これで、SQL Server 2005にアセンブリを登録できた。

SQL Serverへの関数の登録

 ただしこれだけではまだSQL CLRを利用できない。SQL CLRのアセンブリを利用するためには、SQL CLRの実行開始位置(エントリポイント)をSQL Server 2005に関数(Function)として登録する必要があるのだ。

 これを行うには、sqlcmdツールによりSQL Server 2005に接続した状態で、以下のコマンドを実行すればよい。

create function HelloSqlClr() returns nvarchar(max) as external name HelloSQLCLRAssembly.SQLCLR.HelloSqlClr
go

 このコマンドでは、HelloSqlClr()というスカラ値ユーザー定義関数を作成している。関数の戻り値としては、nvarchar(max)型を指定している。

 SQL Server 2005では、nvarcharは4000文字までしか利用できないという制限があるが、nvarchar(max)と書くことによってこれが緩和されて2Gbytes(=2^31-1bytes)までのデータを利用できるようになる。

 また、外部から接続する際の関数名としてここでは、

HelloSQLCLRAssembly.SQLCLR.HelloSqlClr

を指定しているが、この命名規則は、

<登録したアセンブリ名>.<クラス名>.<メソッド名>

という形式である。このように命名することで、クラス名とメソッド名が同一の関数を登録しようとする場合でも重複を回避できる。

 以上でSQL CLRプログラムの作成から、SQL Server 2005への登録までが完了した。

●呼び出しテスト

 それではsqlcmdツールを利用して実際にこれを呼び出してみよう。SQL CLRによるスカラ値ユーザー定義関数は、次のようにして通常の関数と同じように、SELECT文を使って呼び出すことができる。

select dbo.HelloSqlClr()
go

 このSQL文を実行すると、その結果は以下のようになる。

Hello SQL CLR

 無事に.NETのアセンブリが呼び出され、関数の処理が行われたことが確認できる。

 基本的なSQL CLRの利用手順は以上のとおりだ。これらの手順はVisual Studio 2005を利用することでもっと簡略にできる。Visual Studio 2005でSQL CLRの開発を行えば、デバッグなども容易なため開発効率が飛躍的に高まる。

 次章では、ここで示したサンプル・プログラム「Hello SQL CLR」とまったく同じものを、Visual Studio 2005で作成してみよう。


 INDEX
  [特集]SQL Server 2005の新機能「SQL CLR」(前編)
  SQL Serverプログラミングを革新するSQL CLRとは?
     1.従来のSQLプログラミングについて
     2.SQLプログラミングを革新するSQL CLRとは?
     3.SQL CLRの特長とストアド・プロシージャとの使い分け
  [特集]SQL Server 2005の新機能「SQL CLR」(後編)
  Visual Studio 2005でSQL CLRを実装してみる
     1.SQL CLRプログラミングの種類
   2.SQL CLRでHello World!を作成してみる
     3.Visual StudioによるSQL CLRの開発
     4.SQL CLRプログラムの実行
 


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間