Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Conjunto de resultados delimitado por vírgulas + consulta SQL


Esta é uma abordagem muito boa e se tornou muito bem aceita. Existem várias abordagens e isso postagem do blog descreve muito deles.

Uma abordagem interessante que existe é usar o CLR para fazer o trabalho para você, o que reduzirá significativamente a complexidade da consulta com a compensação de executar código externo. Aqui está uma amostra de como a classe pode ficar na montagem.
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);
        }
    }
}

E isso renderia uma consulta um pouco mais como esta.
SELECT CategoryId,
           dbo.strconcat(ProductName)
      FROM Products
     GROUP BY CategoryId ;

O que é um pouco mais simples, obviamente. Leve-o para o que vale a pena :)

Bom dia!