Đây là một cách tiếp cận rất tốt và đã được chấp nhận khá tốt. Có một số cách tiếp cận và điều này bài đăng trên blog mô tả rất nhiều trong số họ.
Một cách tiếp cận thú vị tồn tại là sử dụng CLR để thực hiện công việc cho bạn, điều này sẽ giảm đáng kể độ phức tạp của truy vấn với việc đánh đổi việc chạy mã bên ngoài. Đây là một ví dụ về lớp có thể trông như thế nào trong 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);
}
}
}
Và điều đó sẽ tạo ra một truy vấn giống như thế này hơn một chút.
SELECT CategoryId,
dbo.strconcat(ProductName)
FROM Products
GROUP BY CategoryId ;
Rõ ràng là đơn giản hơn một chút. Hãy lấy nó cho những gì nó đáng giá :)
Chúc một ngày tốt lành!