方法 : CLR の SQL Server の集計を作成および実行する
更新 : 2007 年 11 月
SQL 集計を作成するには、[集計] 項目を SQL Server プロジェクトに追加します。配置が成功すると、マネージ コード内に作成された集計が呼び出され、他の SQL Server の集計と同様に実行されます。
メモ : |
---|
既定では、Microsoft SQL Server では共通言語ランタイム (CLR: Common Language Runtime) 統合機能が無効になっており、SQL Server プロジェクト項目を使用するにはこれを有効にする必要があります。CLR 統合を有効にするには、sp_configure ストアド プロシージャの clr enabled オプションを使用します。詳細については、「CLR 統合の有効化」を参照してください。 |
メモ : |
---|
SQL Server の集計では、4 つの固有のメソッド (Init、Accumulate、Merge、および Terminate) を実装する必要があります。詳細については、SQL Books Online の「SQL CLR .NET ユーザー定義の集計機能」トピックを参照してください。 |
メモ : |
---|
使用している設定またはエディションによっては、表示されるダイアログ ボックスやメニュー コマンドがヘルプに記載されている内容と異なる場合があります。設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。詳細については、「Visual Studio の設定」を参照してください。 |
SQL Server の集計の作成
SQL Server の集計を作成するには
既存の SQL Server プロジェクトを開くか、または新しい SQL Server プロジェクトを作成します。詳細については、「方法 : SQL Server プロジェクトを作成する」を参照してください。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスの [集計] をクリックします。
新しい集計に [ファイル名] を指定します。
集計の実行時に実行するコードを追加します。下記の最初の例を参照してください。
メモ : |
---|
C++ の例は、/clr:safe コンパイラ オプションを使ってコンパイルする必要があります。 |
SQL Server に集計を配置します。詳細については、「方法 : SQL Server のプロジェクト項目を SQL Server に配置する」を参照してください。
SQL Server で集計を実行してデバッグします。下記の 2 番目の例を参照してください。
使用例
この例では、母音の数を数える集計を作成します。この集計は、文字列データ型の列内の母音の数を数えます。この集計には、マルチスレッドで実行できる 4 つの必須メソッド (Init、Accumulate、Merge、および Terminate) が含まれます。
Imports System
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
<Serializable()> _
<SqlUserDefinedAggregate(Format.Native)> _
Public Structure CountVowels
' count only the vowels in the passed-in strings
Private countOfVowels As SqlInt32
Public Sub Init()
countOfVowels = 0
End Sub
Public Sub Accumulate(ByVal value As SqlString)
Dim stringChar As String
Dim indexChar As Int32
' for each character in the given parameter
For indexChar = 0 To Len(value.ToString()) - 1
stringChar = value.ToString().Substring(indexChar, 1)
If stringChar.ToLower() Like "[aeiou]" Then
' it is a vowel, increment the count
countOfVowels = countOfVowels + 1
End If
Next
End Sub
Public Sub Merge(ByVal value As CountVowels)
Accumulate(value.Terminate())
End Sub
Public Function Terminate() As SqlString
Return countOfVowels.ToString()
End Function
End Structure
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable]
[SqlUserDefinedAggregate(Format.Native)]
public struct CountVowels
{
// count only the vowels in the passed-in strings
private SqlInt32 countOfVowels;
public void Init()
{
countOfVowels = 0;
}
public void Accumulate(SqlString value)
{
// list of vowels to look for
string vowels = "aeiou";
// for each character in the given parameter
for (int i=0; i < value.ToString().Length; i++)
{
// for each character in the vowels string
for (int j=0; j < vowels.Length; j++)
{
// convert parameter character to lowercase and compare to vowel
if (value.Value.Substring(i,1).ToLower() == vowels.Substring(j,1))
{
// it is a vowel, increment the count
countOfVowels+=1;
}
}
}
}
public void Merge(CountVowels value)
{
Accumulate(value.Terminate());
}
public SqlString Terminate()
{
return countOfVowels.ToString();
}
}
#include "stdafx.h"
#using <System.dll>
#using <System.Data.dll>
#using <System.Xml.dll>
using namespace System;
using namespace System::Data;
using namespace System::Data::Sql;
using namespace System::Data::SqlTypes;
using namespace Microsoft::SqlServer::Server;
// In order to debug your Aggregate, add the following to your debug.sql file:
//
// SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
// FROM Person.Contact
// GROUP BY LastName
// ORDER BY LastName
//
[Serializable]
[SqlUserDefinedAggregate(Format::Native)]
public value struct CountVowels
{
public:
void Init()
{
countOfVowels = 0;
}
void Accumulate(SqlString value)
{
// list of vowels to look for
String ^vowels = "aeiou";
// for each character in the given parameter
for (int i=0; i < value.ToString()->Length; i++)
{
// for each character in the vowels string
for (int j=0; j < vowels->Length; j++)
{
// convert parameter character to lowercase and compare to vowel
if (value.Value->Substring(i, 1)->ToLower() == vowels->Substring(j, 1))
{
// it is a vowel, increment the count
countOfVowels+=1;
break;
}
}
}
}
void Merge(CountVowels value)
{
Accumulate(value.Terminate());
}
SqlTypes::SqlString Terminate()
{
return countOfVowels.ToString();
}
private:
// count only the vowels in the passed-in strings
SqlInt32 countOfVowels;
};
集計を配置後に SQL Server で実行してテストし、正しいデータが返されることを確認します。このクエリは、結果セットとして、Contact テーブルの LastNames 列のすべての値について、母音の数を返します。
SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
FROM Person.Contact
GROUP BY LastName
ORDER BY LastName
参照
処理手順
方法 : CLR の SQL Server ストアド プロシージャを作成および実行する
方法 : CLR の SQL Server トリガを作成および実行する
方法 : CLR の SQL Server の集計を作成および実行する
方法 : CLR の SQL Server ユーザー定義関数を作成および実行する
方法 : CLR の SQL Server ユーザー定義型を作成および実行する
チュートリアル : マネージ コードでのストアド プロシージャの作成
方法 : SQL CLR のストアド プロシージャをデバッグする
概念
SQL Server の CLR 統合の概要 (ADO.NET)
マネージ コードを使用したデータベース オブジェクトの作成の利点
参照
SQL Server プロジェクトおよびデータベース オブジェクトの属性