Das ist ein sehr guter Ansatz und hat sich mittlerweile recht gut durchgesetzt. Es gibt mehrere Ansätze und dieser Blogbeitrag beschreibt viel von ihnen.
Ein interessanter vorhandener Ansatz besteht darin, die CLR zu verwenden, um die Arbeit für Sie zu erledigen, wodurch die Komplexität der Abfrage erheblich reduziert wird, wenn der Kompromiss besteht, externen Code auszuführen. Hier ist ein Beispiel dafür, wie die Klasse in der Assembly aussehen könnte.
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);
}
}
}
Und das würde eine etwas ähnlichere Abfrage ergeben.
SELECT CategoryId,
dbo.strconcat(ProductName)
FROM Products
GROUP BY CategoryId ;
Was natürlich um einiges einfacher ist. Nimm es für das, was es wert ist :)
Guten Tag!