sql >> Databáze >  >> RDS >> Sqlserver

Sada výsledků oddělených čárkami + SQL dotaz

To je velmi dobrý přístup a stal se docela dobře akceptován. Existuje několik přístupů a tento příspěvek na blogu popisuje hodně z nich.

Jedním zajímavým přístupem, který existuje, je použití CLR, aby to udělal za vás, což výrazně sníží složitost dotazu s kompromisem spouštění externího kódu. Zde je ukázka toho, jak může třída vypadat v sestavení.

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

A to by dotaz trochu více podobný tomuto.

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

Což je samozřejmě o něco jednodušší. Ber to tak, jak to stojí :)

Dobrý den!




  1. Jak REPEAT() funguje v MariaDB

  2. ORA-01855:AM/A.M. nebo PM/P.M. Požadované

  3. Jak mohu použít aktuální datum v dotazu HQL s databází Oracle?

  4. Jak zkontrolovat hodnotu null pro double, která je převzata z databáze