मैंने एक CLR एग्रीगेट फंक्शन
बनाया है। जो एक varchar
लेता है कॉलम और कॉमा द्वारा अलग किए गए इसके सभी मान लौटाता है। दूसरे शब्दों में, यह कई स्ट्रिंग्स को अल्पविराम से अलग की गई सूची में जोड़ता है। मुझे यकीन है कि इसका प्रदर्शन किसी भी टी-एसक्यूएल ट्रिक से बेहतर है .
किसी भी समग्र कार्य के रूप में, इसका उपयोग group by
. के संयोजन में किया जा सकता है . उदाहरण के लिए:
SELECT id, name, desc, JoinStrings(CONVERT(VARCHAR(20), category_id))
FROM product p
INNER JOIN category_products c ON p.category_id = c.category_id
GROUP BY id, name, desc
यहां Sql Server 2008 में CLR असेंबली बनाने के लिए C# कोड दिया गया है:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToDuplicates=false, IsInvariantToOrder=false, IsInvariantToNulls=true, MaxByteSize=-1)]
public struct JoinStrings : IBinarySerialize
{
private char[] sb;
private int pos;
public void Init()
{
sb = new char[512000];
pos = 0;
}
public void Accumulate(SqlString Value)
{
if (Value.IsNull) return;
char[] src = Value.ToString().ToCharArray();
Array.Copy(src, 0, sb, pos, src.Length);
pos += src.Length;
sb[pos] = ',';
pos++;
}
public void Merge(JoinStrings Group)
{
Accumulate(Group.Terminate());
}
public SqlString Terminate()
{
if (pos <= 0)
return new SqlString();
else
return new SqlString(new String(sb, 0, pos-1));
}
public void Read(System.IO.BinaryReader r)
{
this.Init();
pos = r.ReadInt32();
r.Read(sb, 0, pos);
}
public void Write(System.IO.BinaryWriter w)
{
w.Write(pos);
w.Write(sb, 0, pos);
}
}
यहां फंक्शन बनाने के लिए कोड दिया गया है (हालांकि विजुअल स्टूडियो से डिप्लॉय करना इसे स्वचालित रूप से करना चाहिए):
CREATE AGGREGATE [dbo].[JoinStrings]
(@s [nvarchar](4000))
RETURNS[nvarchar](max)
EXTERNAL NAME [YouAssemblyName].[JoinStrings]