Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm phẳng bảng kết hợp thành cột nhiều giá trị?

Tôi đã tạo một Hàm tổng hợp CLR cần một varchar và trả về tất cả các giá trị của nó được phân tách bằng dấu phẩy. Nói cách khác, nó nối một số chuỗi vào một danh sách được phân tách bằng dấu phẩy. Tôi chắc chắn rằng hiệu suất của nó tốt hơn bất kỳ thủ thuật T-Sql nào .

Như bất kỳ hàm tổng hợp nào, nó có thể được sử dụng kết hợp với nhóm group by . Ví dụ:

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

Đây là mã C # để tạo cụm CLR vào 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);
    }
}

Đây là mã để tạo hàm (mặc dù việc triển khai từ Visual Studio sẽ tự động thực hiện):

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. Cách truy xuất các giá trị VARBINARY từ SQL Server 2008 bằng VB.Net

  2. Cần tính toán theo thời gian hoặc con số ngày được làm tròn trong máy chủ sql

  3. Mệnh đề WHERE có điều kiện trong SQL Server

  4. Khung thực thể tải rất chậm lần đầu tiên sau mỗi lần biên dịch

  5. Đạt đến giới hạn tham số 2100 (SQL Server) khi sử dụng Chứa ()