あなたはenumeration formatを指定する必要があるカスタム集計関数を作成します。IBinarySerializeインターフェイスメソッドとは何ですか?
フォーマットの列挙は、ユーザー定義型(UDT)または集計のシリアル化形式 を示すためにSqlUserDefinedTypeAttributeと SqlUserDefinedAggregateAttributeで使用されています。
とUserDefined
フォーマットが使用されている場合、あなたのクラスはIBinarySerialize Interfaceを実装し、そのread
とwrite
メソッドをオーバーライドする必要があります。
私の質問は、これらの方法が正確に何をする必要がありますか?
examplesを見ると、集計結果を読み書きできるはずですか?
たとえば、別の番号を連結するSQL CLR関数を作成しようとしています。 T-SQLでは、1〜255の異なる数字(TINYINT値)を持つことができます。私は(区切り文字を使用して)それらから文字列を作成する必要があるだけでなく、番号を並べ替えます。機能が動作しているようですが、私は期待通りのメソッドをオーバーライドしている正確にわからない:それは上の動作の行を処理して半分の方法である一方、
[Serializable]
[
Microsoft.SqlServer.Server.SqlUserDefinedAggregate
(
Microsoft.SqlServer.Server.Format.UserDefined,
IsInvariantToNulls = true,
IsInvariantToDuplicates = true,
IsInvariantToOrder = false,
MaxByteSize = 1024
)
]
public class ConcatenateAnswersPos : Microsoft.SqlServer.Server.IBinarySerialize
{
private List<byte> intermediateResult;
public void Init()
{
intermediateResult = new List<byte>();
}
public void Accumulate(SqlByte value)
{
intermediateResult.Add((byte)value);
}
public void Merge(ConcatenateAnswersPos other)
{
intermediateResult.AddRange(other.intermediateResult);
}
public SqlString Terminate()
{
if (intermediateResult != null)
{
intermediateResult.Sort();
return new SqlString(string.Join(";", intermediateResult));
}
else
{
return new SqlString("");
}
}
public void Read(BinaryReader r)
{
if (r == null) throw new ArgumentNullException("r");
intermediateResult = new List<byte>();
string[] answers = r.ReadString().Split(';');
foreach (string answer in answers)
{
intermediateResult.Add(Convert.ToByte(answer));
}
}
public void Write(BinaryWriter w)
{
if (w == null) throw new ArgumentNullException("w");
intermediateResult.Sort();
w.Write(string.Join(";", intermediateResult));
}
}
'Write' *を使って書いたものの全体は、' Read'で読み込み可能でなければなりません(読者はあなただけのものではない基底のストリームに座っています)。 *あなたが置くのは、このインターフェースのクライアント(一般的にはSQL Serverコード)には本当に不透明です。 –
'Write'メソッドから' Sort'を取り出したいと思います。そのデータが呼び出し元に実際に可視になる前に、 'Read'を呼び出して再処理されます(おそらく' Merge'の後に) 'Terminate'を呼び出すと、実結果。 –