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
Ouvrez un Projet SQL Server existant ou créez-en un. Pour plus d'informations, consultez Comment : créer un projet SQL Server.
Dans le menu Projet, sélectionnez Ajouter un nouvel élément.
Sélectionnez Agrégat dans la Ajouter un nouvel élément, boîte de dialogue.
Tapez un Nom pour le nouvel agrégat.
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. |
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.
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