Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Ratakan tabel asosiasi ke kolom multi-nilai?

Saya membuat fungsi agregat CLR yang membutuhkan varchar kolom dan mengembalikan semua nilainya dipisahkan dengan koma. Dengan kata lain, ia menggabungkan beberapa string ke dalam daftar yang dipisahkan koma. Saya yakin kinerjanya jauh lebih baik daripada trik T-Sql mana pun .

Seperti fungsi agregat lainnya, ini dapat digunakan dalam kombinasi dengan group by . Misalnya:

SELECT id, name, desc, JoinStrings(CONVERT(VARCHAR(20), category_id))
FROM product p
INNER JOIN category_products c ON p.category_id = c.category_id
GROUP BY id, name, desc

Inilah kode C# untuk membuat CLR assembly ke Sql Server 2008:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;


[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.UserDefined, IsInvariantToDuplicates=false, IsInvariantToOrder=false, IsInvariantToNulls=true, MaxByteSize=-1)]
public struct JoinStrings : IBinarySerialize
{
    private char[] sb;
    private int pos;
    public void Init()
    {
        sb = new char[512000];
        pos = 0;
    }

    public void Accumulate(SqlString Value)
    {
        if (Value.IsNull) return;
        char[] src = Value.ToString().ToCharArray();
        Array.Copy(src, 0, sb, pos, src.Length);
        pos += src.Length;
        sb[pos] = ',';
        pos++;
    }

    public void Merge(JoinStrings Group)
    {
        Accumulate(Group.Terminate());
    }

    public SqlString Terminate()
    {
        if (pos <= 0) 
            return new SqlString();
        else
            return new SqlString(new String(sb, 0, pos-1));
    }

    public void Read(System.IO.BinaryReader r)
    {
        this.Init();
        pos = r.ReadInt32();
        r.Read(sb, 0, pos);
    }

    public void Write(System.IO.BinaryWriter w)
    {
        w.Write(pos);
        w.Write(sb, 0, pos);
    }
}

Berikut kode untuk membuat fungsi (walaupun penerapan dari Visual Studio harus melakukannya secara otomatis):

CREATE AGGREGATE [dbo].[JoinStrings]
(@s [nvarchar](4000))
RETURNS[nvarchar](max)
EXTERNAL NAME [YouAssemblyName].[JoinStrings]


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Permintaan untuk Hubungan Orang Tua Anak ke tingkat atas

  2. Apakah ada tes JIKA ADA untuk server yang ditautkan?

  3. Pekerjaan Agen SQL:Tentukan berapa lama telah berjalan

  4. SQL, tabel angka bantu

  5. Apa itu Stored Procedure dan Mengapa Stored Procedure?