sql >> Databasteknik >  >> RDS >> Sqlserver

Kommaavgränsade resultatuppsättning + SQL-fråga

Detta är ett mycket bra tillvägagångssätt och har blivit ganska väl accepterat. Det finns flera tillvägagångssätt och detta blogginlägg beskriver mycket av dem.

Ett intressant tillvägagångssätt som finns är att använda CLR för att göra jobbet åt dig, vilket avsevärt kommer att minska komplexiteten i frågan med kompromissen med att köra extern kod. Här är ett exempel på hur klassen kan se ut i sammanställningen.

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

Och det skulle skapa en fråga lite mer så här.

SELECT CategoryId,
           dbo.strconcat(ProductName)
      FROM Products
     GROUP BY CategoryId ;

Vilket är lite enklare så klart. Ta det för vad det är värt :)

God dag!




  1. Förfallodatum som standardvärde för kolumnen TIMESTAMP

  2. Hur konverterar man tomma utrymmen till null-värden med hjälp av SQL Server?

  3. SQL mellan inte inkluderande

  4. Hur man genererar 52 veckor från aktuellt datum med Postgresql