Dette er en meget god tilgang og er blevet ret godt accepteret. Der er flere tilgange, og dette blogindlæg beskriver meget af dem.
En interessant tilgang, der findes, er at bruge CLR til at gøre arbejdet for dig, hvilket vil reducere kompleksiteten af forespørgslen markant med afvejningen af at køre ekstern kode. Her er et eksempel på, hvordan klassen kan se ud i forsamlingen.
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);
}
}
}
Og det ville give en forespørgsel lidt mere som denne.
SELECT CategoryId,
dbo.strconcat(ProductName)
FROM Products
GROUP BY CategoryId ;
Hvilket selvfølgelig er en del enklere. Tag det for hvad det er værd :)
God dag!