2017-12-26 24 views
0

SQL Serverでカスタム集計関数を作成しようとしています。私はついにそれを働かせました(C#でアセンブリを書いています)。SQL Serverでユーザー定義集計の結果が正しくありません

目的は、グループ内のすべての文字列を連結することですが、結果は空の文字列です。ここで

は、C#で私のクラスである:

[SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = 32)] 
public struct STRING_CONCAT : IBinarySerialize 
{ 
    //result - concatenated string 
    SqlString result; 

    public void Init() 
    { 
     //empty the result 
     result = ""; 
    } 

    public void Accumulate(SqlString value) 
    { 
     result += value; 
    } 

    public void Merge(STRING_CONCAT value) 
    { 
     Accumulate(value.Terminate()); 
    } 

    public SqlString Terminate() 
    { 
     return result; 
    } 

    public void Read(BinaryReader r) 
    { 
     r.BaseStream.Position = 0; 
     result = r.ReadString(); 
    } 

    public void Write(BinaryWriter w) 
    { 
     w.Write(result.GetUnicodeBytes()); 
     w.BaseStream.Position = 0; 
    } 
} 

そしてここでは、T-SQLの一部です:

CREATE ASSEMBLY [SQLAggregate] 
FROM 'C:\CSharp\SQLAggregate\SQLAggregate\bin\Debug\SQLAggregate.dll' 
GO 

create aggregate STRING_CONCAT 
(@string nvarchar(100)) 
returns nvarchar(4000) 
external name [SQLAggregate].[SQLAggregate.STRING_CONCAT] 
+0

デバッグヘルプ(「なぜこのコードは機能していませんか?」)には、目的の動作、特定の問題またはエラー、および質問自体に再現するのに必要な最短コードが含まれている必要があります。 –

+2

@TabAllemanこの質問にはすべてが含まれています。 – Evk

+0

@Evkここで、入力と期待される出力はどこに表示されますか? –

答えて

0

BinaryReader/BinaryWriter上の位置の設定を削除し、w.Write(result.Value);w.Write(result.GetUnicodeBytes());を変更します。

+0

その後、私は 'EndOfStreamException'を得ます –

+0

その場合。ユニコードバイトではない文字列を書き込みます。 w.Write(result.Value): – TcKs

+0

よかった、ありがとう。 –

関連する問題