質問

こちらを読みました(および他の場所)では、SQL Server 2008では、8000文字を超える文字列を返すことができるユーザー定義の集計を作成できます。これはまさに私が必要なものです。

おそらく、メソッドはmaxByteSizeを1と8000の数値ではなく-1に設定することです。これにより、最大2GBの任意のサイズが許可されます。

どういうわけか、この設定を使用すると、どうやらVisual Studio 2008から直接展開することはできません。手動でデプロイする必要があります。

そう:私はプロジェクトをビルドします-GroupConcat(MySQLのgroup_concatアグリゲーターをシミュレートすることになっています)-プロジェクトのbinフォルダーに、ファイル" SqlClassLibrary.dll"を与えます。上記のリンクページの手順に従って、SQL Serverでアセンブリをビルドします。コマンドは正常に実行されます。ただし、実際にgroupconcatアグリゲーターを使用しようとすると:

部門を選択し、部門別のプロジェクトリーダーグループからdbo.groupconcat(projectNumber)

...見つからないという。 maxByteSizeを8000に設定し、VS2008内から直接展開する場合、これはすべて正常に機能しますが、> 8000が必要です。誰が私が間違っているのか知っていますか?

ありがとう -ダン

注:よく目にするSQL Serverのトリックを使用するのではなく、具体的にgroupconcatのアグリゲーター機能が必要です。

役に立ちましたか?

解決 2

それを考え出した... Vis Studioでソリューションをビルドした後、作成した.dllをc:\ tempにドロップし、GroupConcat.dllと呼んだと仮定して

CREATE ASSEMBLY GroupConcat from 'C:\temp\GroupConcat.dll' with permission_set = safe
GO

CREATE AGGREGATE groupconcat(@input nvarchar(max))
RETURNS nvarchar(max)
EXTERNAL NAME GroupConcat
GO

それはそれです。

他のヒント

代わりに、 SqlFacetAttribute MaxSize プロパティを使用して、varcharサイズを示すことができます。以下の例では、この属性を Accumulate メソッドの SqlString パラメーターと Terminate メソッドの戻り値に適用したことに注意してください。これにより、次のSQLシグネチャが生成されます。

AGGREGATE [dbo]。[Concatenate](@value nvarchar(max)、@order int、@seperator nvarchar(max))RETURNS nvarchar(max)

[Serializable]
[SqlUserDefinedAggregate(
    Format.UserDefined,
    IsInvariantToOrder      = true,
    IsInvariantToNulls      = true,
    IsInvariantToDuplicates = false,
    IsNullIfEmpty           = false,
    MaxByteSize             = -1)]
public struct Concatenate : IBinarySerialize
{
    public void Init();

    public void Accumulate([SqlFacet(MaxSize = -1)] SqlString value,
                                                    SqlInt32  order,
                           [SqlFacet(MaxSize = -1)] SqlString seperator);

    public void Merge(Concatenate group);

    [return: SqlFacet(MaxSize = -1)]
    public SqlString Terminate();

    public void Read(BinaryReader r);

    public void Write(BinaryWriter w);
}

これがもう「正しい」かどうかわかりません。あなたがやったことよりも、それはより自然に思えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top