Comment : créer et exécuter un agrégat SQL Server CLR

Mise à jour : novembre 2007

Créez des agrégats SQL en ajoutant des éléments Agrégat à des projets SQL Server. Une fois le déploiement réussi, les agrégats créés dans le code managé sont appelés et exécutés comme tout autre agrégat SQL Server.

Remarque :

La fonctionnalité d'intégration du Common Language Runtime (CLR) est désactivée par défaut dans Microsoft SQL Server et doit être activée pour utiliser des éléments de projet SQL Server. Pour activer l'intégration du CLR, utilisez l'option clr enabled de la procédure stockée sp_configure. Pour plus d'informations, consultez Activation de l'intégration CLR.

Remarque :

Les agrégats SQL Server exigent l'implémentation de quatre méthodes spécifiques : Init, Accumulate, Merge et Terminate. Pour plus d'informations, consultez la rubrique SQL CLR .NET User-Defined Aggregate Functions dans la documentation en ligne de SQL.

Remarque :

Les boîtes de dialogue et les commandes de menu qui s'affichent peuvent être différentes de celles qui sont décrites dans l'aide, en fonction de vos paramètres actifs ou de l'édition utilisée. Pour modifier vos paramètres, choisissez Importation et exportation de paramètres dans le menu Outils. Pour plus d'informations, consultez Paramètres Visual Studio.

Création d'un agrégat SQL Server

Pour créer un agrégat SQL Server

  1. Ouvrez un Projet SQL Server existant ou créez-en un. Pour plus d'informations, consultez Comment : créer un projet SQL Server.

  2. Dans le menu Projet, sélectionnez Ajouter un nouvel élément.

  3. Sélectionnez Agrégat dans la Ajouter un nouvel élément, boîte de dialogue.

  4. Tapez un Nom pour le nouvel agrégat.

  5. Ajoutez le code à exécuter lors de l'application de l'agrégat. Consultez le premier exemple ci-dessous.

Remarque :

Les exemples C++ doivent être compilés avec l'option du compilateur /clr:safe.

  1. Déployez l'agrégat sur SQL Server. Pour plus d'informations, consultez Comment : déployer des éléments de projet SQL Server sur un serveur SQL Server.

  2. Déboguez l'agrégat en l'exécutant sur SQL Server. Consultez le second exemple ci-dessous.

Exemple

Cet exemple crée un agrégat permettant de compter les voyelles. Cet agrégat compte les voyelles contenues dans une colonne des types de données String. Il contient les quatre méthodes requises suivantes qui peuvent s'exécuter en multithread : Init, Accumulate, Merge et 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;
};

Une fois l'agrégat déployé, testez-le en l'exécutant sur SQL Server et en vérifiant que les données correctes sont retournées. Cette requête retourne un jeu de résultats du nombre de voyelles de toutes les valeurs contenues dans la colonne LastNames de la table Contact.

SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
FROM Person.Contact
GROUP BY LastName
ORDER BY LastName

Voir aussi

Tâches

Comment : créer un projet SQL Server

Comment : créer et exécuter une procédure stockée SQL Server CLR

Comment : créer et exécuter un déclencheur SQL Server CLR

Comment : créer et exécuter un agrégat SQL Server CLR

Comment : créer et exécuter une fonction définie par l'utilisateur SQL Server CLR

Comment : créer et exécuter un type défini par l'utilisateur SQL Server CLR

Procédure pas à pas : création d'une procédure stockée dans le code managé

Comment : déboguer une procédure stockée SQL CLR

Concepts

Présentation de l'intégration de CLR dans SQL Server (ADO.NET)

Avantages de l'utilisation de code managé pour créer des objets de base de données

Modèles d'élément pour les projets SQL Server

Référence

Attributs pour les projets SQL Server et les objets de base de données

Autres ressources

Débogage d'une base de données SQL CLR