方法: 共通言語ランタイム統合機能を使用して SQL Server の集計を作成および実行する
SQL Server 共通言語ランタイム (SQL CLR) データベース プロジェクトに [集計] 項目を追加して、SQL Server の集計を作成します。 配置が成功すると、マネージ コード内に作成された集計が呼び出され、他の SQL Server の集計と同様に実行されます。
SQL Server の集計では、4 つの固有のメソッド (Init、Accumulate、Merge、および Terminate) を実装する必要があります。 詳細については、Microsoft Web サイトの SQL Server Books Online の「CLR ユーザー定義集計の要件」を参照してください。
注意
使用している設定またはエディションによっては、ヘルプの記載と異なるダイアログ ボックスやメニュー コマンドが表示される場合があります。 設定を変更するには、[ツール] メニューの [設定のインポートとエクスポート] をクリックします。 詳細については、「設定の操作」を参照してください。
SQL Server の集計の作成
SQL Server の集計を作成するには
既存の SQL CLR データベース プロジェクトを開くか、または新しいプロジェクトを作成します。 詳細については、「方法: SQL Server 共通言語ランタイム統合機能を使用するデータ オブジェクトのプロジェクトを作成する」を参照してください。
[プロジェクト] メニューの [新しい項目の追加] をクリックします。
[新しい項目の追加] ダイアログ ボックスで、[集計] をクリックします。
新しい集計に [ファイル名] を指定します。
集計の実行時に実行するコードを追加します。 下記の最初の例を参照してください。
SQL Server に集計を配置します。 詳細については、「方法: SQL CLR データベース プロジェクト項目を SQL Server に配置する」を参照してください。
重要
2.0、3.0、または 3.5 バージョンの .NET Framework でビルドした SQL Server プロジェクトをサポートするのは、SQL Server 2005 および SQL Server 2008 のみです。 展開すると、SQL ServerプロジェクトSQL Server 2005またはSQL Server 2008、エラーが表示されます。Deploy error (SQL01268): .NET SqlClient Data Provider: Msg 6218, Level 16, State 3, Line 1 CREATE ASSEMBLY for assembly 'AssemblyName' failed because assembly 'AssemblyName' failed verification. Check if the referenced assemblies are up-to-date and trusted (for external_access or unsafe) to execute in the database(ここでAssemblyNameは、展開するアセンブリの名前です)。 詳細については、「方法: SQL Server 共通言語ランタイム統合機能を使用するデータ オブジェクトのプロジェクトを作成する」を参照してください。
SQL Server で集計を実行してデバッグします。 この手順に続く 2 番目の例を参照してください。
使用例
この例では、母音の数を数える集計を作成します。 この集計は、文字列データ型の列内の母音の数を数えます。 集計にはマルチ スレッド実行できます次 4 必要なメソッドが含まれています。Init、蓄積、マージ、および終了します。
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();
}
}
集計を配置後に SQL Server で実行してテストし、正しいデータが返されることを確認します。 このクエリは、結果セットとして、Contact テーブルの LastNames 列のすべての値について、母音の数を返します。
注意
AdventureWorks2005 を使用している場合、サンプル Transact-SQL コードの Person.Person を Person.Contact に置き換えます。
SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
FROM Person.Person
GROUP BY LastName
ORDER BY LastName
参照
処理手順
方法: SQL Server 共通言語ランタイム統合機能を使用するデータ オブジェクトのプロジェクトを作成する
方法: 共通言語ランタイム統合機能を使用して SQL Server ストアド プロシージャを作成および実行する
方法: 共通言語ランタイム統合機能を使用して SQL Server のトリガーを作成および実行する
方法: 共通言語ランタイム統合機能を使用して SQL Server のユーザー定義関数を作成および実行する
方法: 共通言語ランタイム統合機能を使用して SQL Server のユーザー定義型を作成および実行する
チュートリアル : マネージ コードでのストアド プロシージャの作成
方法 : SQL CLR のストアド プロシージャをデバッグする
参照
SQL CLR データベース プロジェクトおよびデータベース オブジェクトの属性
概念
SQL Server の CLR 統合の概要 (ADO.NET)
マネージ コードを使用したデータベース オブジェクトの作成の利点