To je velmi dobrý přístup a stal se docela dobře akceptován. Existuje několik přístupů a tento příspěvek na blogu popisuje hodně z nich.
Jedním zajímavým přístupem, který existuje, je použití CLR, aby to udělal za vás, což výrazně sníží složitost dotazu s kompromisem spouštění externího kódu. Zde je ukázka toho, jak může třída vypadat v sestavení.
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);
}
}
}
A to by dotaz trochu více podobný tomuto.
SELECT CategoryId,
dbo.strconcat(ProductName)
FROM Products
GROUP BY CategoryId ;
Což je samozřejmě o něco jednodušší. Ber to tak, jak to stojí :)
Dobrý den!