方法: 共通言語ランタイム統合機能を使用して 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 の集計を作成するには

  1. 既存の SQL CLR データベース プロジェクトを開くか、または新しいプロジェクトを作成します。 詳細については、「方法: SQL Server 共通言語ランタイム統合機能を使用するデータ オブジェクトのプロジェクトを作成する」を参照してください。

  2. [プロジェクト] メニューの [新しい項目の追加] をクリックします。

  3. [新しい項目の追加] ダイアログ ボックスで、[集計] をクリックします。

  4. 新しい集計に [ファイル名] を指定します。

  5. 集計の実行時に実行するコードを追加します。 下記の最初の例を参照してください。

  6. 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 共通言語ランタイム統合機能を使用するデータ オブジェクトのプロジェクトを作成する」を参照してください。

  7. 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)

マネージ コードを使用したデータベース オブジェクトの作成の利点

その他の技術情報

マネージ コードでの SQL Server オブジェクトの作成