sql >> Database >  >> RDS >> Sqlserver

Associatietabel afvlakken naar kolom met meerdere waarden?

Ik heb een CLR-aggregatiefunctie gemaakt waarvoor een varchar . nodig is kolom en retourneert alle waarden gescheiden door komma's. Met andere woorden, het voegt verschillende strings samen tot een door komma's gescheiden lijst. Ik weet zeker dat de prestaties veel beter zijn dan welke T-Sql-truc dan ook .

Zoals elke aggregatiefunctie kan deze worden gebruikt in combinatie met group by . Bijvoorbeeld:

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

Hier is de C#-code om de CLR-assembly in Sql Server 2008 te maken:

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);
    }
}

Hier is de code om de functie te maken (hoewel implementeren vanuit Visual Studio dit automatisch zou moeten doen):

CREATE AGGREGATE [dbo].[JoinStrings]
(@s [nvarchar](4000))
RETURNS[nvarchar](max)
EXTERNAL NAME [YouAssemblyName].[JoinStrings]


  1. De installatie van Oracle Developer Tools 12 mislukt en beweert dat ik Windows XP heb. Ik heb Windows 7

  2. flyway kan geen verbinding maken met de postgres-container in het docker-entrypoint-initdb.d-script

  3. SQLAlchemy:Elke beperking om een ​​van de twee kolommen te controleren is niet null?

  4. Hoe ontsnap ik aan gereserveerde woorden die als kolomnamen worden gebruikt? MySQL/tabel maken