チュートリアル : SQL CLR のユーザー定義のテーブル値関数のデバッグ
更新 : 2007 年 11 月
このトピックの内容は、次の製品に該当します。
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
||||
Standard |
||||
Pro/Team |
表の凡例 :
対象 |
|
該当なし |
|
既定で非表示のコマンド |
この例では、SQL CLR のユーザー定義のテーブル値関数 (UDF: User Defined Table-Valued Function) をデバッグする方法について説明します。
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
SQL CLR のユーザー定義のテーブル値関数をデバッグするには
新しい SQL Server プロジェクトで、データベースへの接続を確立します。詳細については、「方法 : データベースに接続する」を参照してください。
下のセクションにある最初のサンプル コードを使用して、新しい関数を作成し、TableOfPrimes.cs という名前を付けます。詳細については、「方法 : SQL Server のプロジェクトの種類を使用して開発する」を参照してください。
SELECT ステートメントに含めて、関数をテストするスクリプトを追加します。ソリューション エクスプローラの TestScripts ディレクトリを右クリックし、[テスト スクリプトの追加] をクリックして、後述する 2 つ目のサンプルにあるコードを挿入します。ファイルに TestPrime.sql という名前を付けて、保存します。ファイル名を右クリックし、[既定のデバッグ スクリプトの設定] をクリックします。
TableOfPrimes.cs にブレークポイントを設定し、[デバッグ] メニューの [開始] をクリックし、プロジェクトのコンパイル、配置、および単体テストを実行します。黄色の矢印で表される命令ポインタがブレークポイントに表示されて、SQL CLR コードのデバッグが行われます。
いろいろなデバッグ機能を試してください。
[デバッグ] メニューの [ステップ イン] を繰り返しクリックすると、関数の行ごとの実行を確認できます。
1 ステップずつ実行すると、[ローカル] ウィンドウと [ウォッチ] ウィンドウを使用して、異なるメンバの値を確認できます。
関数のデバッグを終了するには、もう一度 [続行] をクリックします。
[出力] ウィンドウで、[出力元の表示] ドロップダウン リストの [データベース出力] をクリックすると、TestPrimes.sql スクリプトの 2 つのクエリを実行した結果を確認できます。
使用例
これは、イベント ログを読み取るコードです。
using System;
using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Collections;
public partial class UserDefinedFunctions
{
struct primeIndex
{
public int n;
public int p;
public primeIndex(int n, int p)
{
this.n = n; this.p = p;
}
}
static bool isPrime(int p)
{
if (p < 2) return false;
if (p == 2) return true;
if (p % 2 == 0) return false;
for (int d = 3; d * d <= p; d+=2)
{
if (p % d == 0) return false;
}
return true;
}
static int nextPrime(int p)
{
int result = p + 1;
while (!isPrime(result)) result++;
return result;
}
[SqlFunction(FillRowMethodName = "Fill", TableDefinition = "n int,p int,est float")]
public static IEnumerable TableOfPrimes(int n)
{
int p = 1;
for (int i = 1; i <= n; i++)
{
p = nextPrime(p);
yield return new primeIndex(i, p);
}
}
private static void Fill(object source, out int n, out int p, out SqlDouble est)
{
primeIndex pi = (primeIndex)source;
n = pi.n;
p = pi.p;
if (n <5)
est = SqlDouble.Null;
else
{
double log = Math.Log(n);
double loglog = Math.Log(log);
est = n * (log + loglog - 1 + loglog / log - 2 / log);
}
}
}
これは、関数を呼び出すテスト スクリプトです。
SELECT n,p,est FROM dbo.TableOfPrimes(50)
SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(500) ORDER BY factor DESC
SELECT TOP 10 n, p, est, est/p AS factor FROM dbo.TableOfPrimes(1000) WHERE n>500 ORDER BY factor DESC
参照
処理手順
方法 : CLR の SQL Server ユーザー定義関数を作成および実行する