sql >> Base de Datos >  >> RDS >> Sqlserver

Conjunto de resultados delimitados por comas + consulta SQL

Este es un muy buen enfoque y ha sido bastante bien aceptado. Hay varios enfoques y este entrada de blog describe mucho de ellos.

Un enfoque interesante que existe es usar CLR para que haga el trabajo por usted, lo que reducirá significativamente la complejidad de la consulta con la compensación de ejecutar código externo. Este es un ejemplo de cómo se vería la clase en el ensamblado.

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

Y eso generaría una consulta un poco más como esta.

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

Que es un poco más simple, obviamente. Tómalo por lo que vale :)

¡Buenos días!