C'est une très bonne approche et elle est assez bien acceptée. Il existe plusieurs approches et cela article de blog décrit beaucoup d'entre eux.
Une approche intéressante qui existe consiste à utiliser le CLR pour faire le travail à votre place, ce qui réduira considérablement la complexité de la requête avec le compromis d'exécuter du code externe. Voici un exemple de ce à quoi la classe pourrait ressembler dans l'assembly.
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;
[Serializable]
[SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize=8000)]
public struct strconcat : IBinarySerialize{
private List values;
public void Init() {
this.values = new List();
}
public void Accumulate(SqlString value) {
this.values.Add(value.Value);
}
public void Merge(strconcat value) {
this.values.AddRange(value.values.ToArray());
}
public SqlString Terminate() {
return new SqlString(string.Join(", ", this.values.ToArray()));
}
public void Read(BinaryReader r) {
int itemCount = r.ReadInt32();
this.values = new List(itemCount);
for (int i = 0; i <= itemCount - 1; i++) {
this.values.Add(r.ReadString());
}
}
public void Write(BinaryWriter w) {
w.Write(this.values.Count);
foreach (string s in this.values) {
w.Write(s);
}
}
}
Et cela ferait une requête un peu plus comme celle-ci.
SELECT CategoryId,
dbo.strconcat(ProductName)
FROM Products
GROUP BY CategoryId ;
Ce qui est évidemment un peu plus simple. Prenez-le pour ce qu'il vaut :)
Bonne journée !