sql >> データベース >  >> RDS >> Sqlserver

関連付けテーブルを複数値列にフラット化しますか?

    CLR 集計関数 を作成しました varchar を取る 列に含まれ、コンマで区切られたすべての値を返します。つまり、複数の文字列をカンマ区切りのリストに結合します。 そのパフォーマンスは T-Sql トリックよりもはるかに優れていると確信しています .

    他の集計関数と同様に、group by と組み合わせて使用​​できます。 .例:

    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
    

    CLR アセンブリを Sql Server 2008 に作成する C# コードは次のとおりです:

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

    関数を作成するコードは次のとおりです (ただし、Visual Studio からデプロイすると自動的に行われます):

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


    1. mysqlサーバーとの休止状態セッションを適切に閉じる方法

    2. PostgreSQLの根性:「resjunk」とは何ですか?

    3. エラー2002(HY000):ソケット'/tmp/mysql.sock'を介してローカルMySQLサーバーに接続できません

    4. PHP-in_arrayのデータをフォーマットする方法