Esta é uma abordagem muito boa e se tornou muito bem aceita. Existem várias abordagens e isso postagem do blog descreve muito deles.
Uma abordagem interessante que existe é usar o CLR para fazer o trabalho para você, o que reduzirá significativamente a complexidade da consulta com a compensação de executar código externo. Aqui está uma amostra de como a classe pode ficar na montagem.
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);
}
}
}
E isso renderia uma consulta um pouco mais como esta.
SELECT CategoryId,
dbo.strconcat(ProductName)
FROM Products
GROUP BY CategoryId ;
O que é um pouco mais simples, obviamente. Leve-o para o que vale a pena :)
Bom dia!