SQL Server 2005 CTPレビュー(開発者編) Page 2/3

SQL CLR vs. Transact-SQLの真実

株式会社システムインテグレータ
石橋 潤一
2005/9/6

SQL CLRでコーディングはどう変わるか

 ここまでSQL CLRの基本情報を紹介してきましたが、続いて実際のコードを見ながらTransact-SQLとSQL CLRの簡単な比較を行いたいと思います。

 まずはTransact-SQLから。処理としては、あるテーブルからデータを取り出し、条件に従って処理を行い、結果を返すという単純なものです。

CREATE PROCEDURE sp_stored AS
BEGIN
    --変数宣言
    DECLARE @strbuf varchar(50),
            @Manager int,
            @Name varchar(50)

    --カーソル宣言
    DECLARE csr CURSOR FOR
    SELECT
        Manager,
        Name
        FROM Employee

    --カーソルオープン
    OPEN csr
    FETCH csr
        INTO
            @Manager,
            @Name

    --ループ処理
    WHILE(@@FETCH_STATUS = 0)
    BEGIN
        IF @Manager = 1
            BEGIN
                SET @strbuf = 'Manager ' + @Name
            END
        ELSE
            BEGIN
                SET @strbuf = @Name
            END

        PRINT @strbuf

        FETCH NEXT FROM csr
            INTO
                @Manager,
                @Name
    END
END

--終了処理
CLOSE csr
DEALLOCATE csr
リスト1 Transact-SQLの典型的なコード

 C#などのオブジェクト指向言語に慣れていると、非常に見づらい部分もあると思います。また、コーディングに当たってはテキストエディタでコーディングしているようなものなので、決して生産性は高くありません。

 続いて、同じ処理内容をSQL CLRで書いたものです。

using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;


public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void sp_SQLCLR()
    {
        // 変数宣言
        string bufstr;
        SqlPipe pipe = SqlContext.Pipe;
        SqlCommand cmd = new SqlCommand();

        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "SELECT Manager, Name FROM Employee";
        cmd.Connection =
            new SqlConnection("Context Connection=true");
        cmd.Connection.Open();

        //SQLの実行
        SqlDataReader reader = cmd.ExecuteReader();

        pipe.Send("Hello world from SQL CLR!!");

        try
        {
            while (reader.Read())
            {
                if (reader["Manager"].Equals(1))
                    bufstr = "Manager " +
                             reader["Name"].ToString();
                else
                    bufstr = reader["Name"].ToString();

                //クライアントにデータ送信
                pipe.Send(bufstr);
            }
        }
        catch
        {
            pipe.Send("例外発生!!");
        }

        //終了処理
        reader.Close();
        cmd.Connection.Close();
    }
};
リスト2 SQL CLRで書き換えたコード

 Transact-SQLから一転、見慣れたどこにでもあるデータベース・アクセスを行うC#のコードです。SQL CLRではこのような“慣れた”コードでストアドプロシージャを作成することが可能となります。また、SQL CLRで作成したストアドプロシージャの利用方法はTransact-SQLで書かれたものと同様で、コードをコンパイルした後SQL Server上に配置することにより、呼び出すことができます。

 Transact-SQLに比べ、普段から使い慣れた言語を用いてコーディングするアドバンテージが大きいことに加え、コーディングの際は非常に優れた統合開発環境(IDE)であるVisual Studio 2005を利用できます。サンプルのコード量ぐらいでは特に問題はありませんが、例えば会計システムの仕訳処理をストアドプロシージャで実装した場合、コードは数千、数万行になってしまうこともあります。このようなコード量になると当然潜在的なバグが増え、コードをデバッグする環境によって大幅に生産性の違いが生まれるでしょう。

 また、Transact-SQLのサンプルにはなかった例外処理(try…catch…)をSQL CLRのコードに加えていますが、こういった言語仕様としての優位性もSQL CLRの強みです。(次ページに続く)

  2/3

 Index
連載:SQL Server 2005 CTPレビュー(開発者編)
SQL CLR vs. Transact-SQLの真実
  Page 1
・SQL CLRが開発者に与えるインパクト
Page 2
・SQL CLRでコーディングはどう変わるか
  Page 3
・Transact-SQLか? SQL CLRか? パフォーマンスで勝負!


SQL Server 2005 CTPレビュー


Database Expert フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Database Expert 記事ランキング

本日月間