Procedura: creare ed eseguire un aggregato SQL Server tramite l'integrazione di Common Language Runtime
Per creare aggregati SQL Server, è necessario aggiungere elementi Aggregato ai progetti di database CLR SQL. Al termine della distribuzione, gli aggregati creati in codice gestito vengono chiamati ed eseguiti come qualsiasi altro aggregato SQL Server.
Gli aggregati SQL Server richiedono l'implementazione di quattro metodi specifici: Init, Accumulate, Merge e Terminate. Per ulteriori informazioni, vedere Requisiti per le aggregazioni CLR definite dall'utente nella documentazione online di SQL Server presente nel sito Web Microsoft.
Nota
Le finestre di dialogo e i comandi di menu visualizzati potrebbero non corrispondere a quelli descritti nella Guida in quanto dipendono dall'edizione o dalle impostazioni in uso. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere la classe Gestione delle impostazioni.
Creazione di un aggregato di SQL Server
Per creare un aggregato di SQL Server
Aprire un Progetto di database CLR SQL esistente o crearne uno nuovo. Per ulteriori informazioni, vedere Procedura: creare un progetto per gli oggetti di database che utilizzano l'integrazione di Common Language Runtime di SQL Server.
Scegliere Aggiungi nuovo elemento dal menu Progetto.
Nella finestra di dialogo Aggiungi nuovo elemento selezionare Aggregato.
Nella casella Nome digitare un nome per il nuovo aggregato.
Aggiungere il codice da eseguire quando viene eseguito l'aggregato. Vedere il primo esempio che segue questa procedura.
Distribuire l'aggregato in un SQL Server. Per ulteriori informazioni, vedere Procedura: distribuire elementi di progetti di database CLR SQL Server su SQL Server.
Importante SQL Server 2005 e SQL Server 2008 supportano solo i progetti SQL Server compilati con la versione 2.0, 3.0 o 3.5 di .NET Framework. Se si tenta di implementare un progetto SQL Server in SQL Server 2005 o SQL Server 2008, viene visualizzato un errore: 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 (dove AssemblyName è il nome dell'assembly che si sta implementando). Per ulteriori informazioni, vedere Procedura: creare un progetto per gli oggetti di database che utilizzano l'integrazione di Common Language Runtime di SQL Server.
Eseguire il debug dell'aggregato eseguendolo in SQL Server. Vedere il secondo esempio che segue questa procedura.
Esempio
In questo esempio viene creato un aggregato per contare le vocali. Questo aggregato conta le vocali presenti in una colonna di dati di tipo stringa. L'aggregazione contiene i seguenti quattro metodi richiesti, che possono eseguire multithreading: Init, accumulate, merge e 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();
}
}
Dopo aver distribuito l'aggregato, verificarlo eseguendolo su SQL Server e assicurarsi che vengano restituiti i dati corretti. Questa query restituisce un gruppo di risultati ottenuto dal conteggio delle vocali di tutti i valori presenti nella colonna LastNames della tabella Contact.
Nota
Se si utilizza AdventureWorks2005, sostituire Person.Person con Person.Contact nel codice Transact-SQL di esempio.
SELECT LastName, COUNT(LastName) AS CountOfLastName, dbo.CountVowels(LastName) AS CountOfVowels
FROM Person.Person
GROUP BY LastName
ORDER BY LastName
Vedere anche
Attività
Procedura dettagliata: creazione di una stored procedure nel codice gestito
Procedura: eseguire il debug di una stored procedure CLR SQL
Riferimenti
Attributi per oggetti di database e progetti di database CLR SQL
Concetti
Introduzione all'integrazione con CLR di SQL Server (ADO.NET)
Vantaggi dell'utilizzo di codice gestito per creare oggetti di database