Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

बहु-मान कॉलम में एसोसिएशन तालिका को फ़्लैट करें?

मैंने एक 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]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. अपने SQL सर्वर संस्करण की जाँच कैसे करें

  2. SQL सर्वर UPDATE लेनदेन को कैसे संभालता है?

  3. CTE त्रुटि:प्रकार एंकर और पुनरावर्ती भाग के बीच मेल नहीं खाते

  4. एसक्यूएल सर्वर 2016

  5. SQL सर्वर 2008 में घंटे और मिनटों का योग