Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Ensemble de résultats délimité par des virgules + requête SQL

C'est une très bonne approche et elle est assez bien acceptée. Il existe plusieurs approches et cela article de blog décrit beaucoup d'entre eux.

Une approche intéressante qui existe consiste à utiliser le CLR pour faire le travail à votre place, ce qui réduira considérablement la complexité de la requête avec le compromis d'exécuter du code externe. Voici un exemple de ce à quoi la classe pourrait ressembler dans l'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);
        }
    }
}

Et cela ferait une requête un peu plus comme celle-ci.

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

Ce qui est évidemment un peu plus simple. Prenez-le pour ce qu'il vaut :)

Bonne journée !