2009-03-07 9 views
3

here(および他の箇所)は、SQL Server 2008で8000文字を超える文字列を返すユーザー定義の集計を構築することが可能であることを示しています。これは私が必要とするものです。SQL Server 2008のユーザー定義集計 - MaxByteSize = -1を使用して展開する方法は?

おそらく、maxByteSizeを数字btw1および8000の代わりに-1に設定するとします。これにより、2GBまでの任意のサイズを許可する必要があります。

この設定を使用すると、何らかの理由でVisual Studio 2008から直接展開することはできません。手動で展開する必要があります。

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

select department, dbo.groupconcat(projectNumber) from projectleads group by department

...それはそれは見つけることができないと言います。これは、maxByteSizeを8000に設定し、VS2008から直接デプロイするとうまく動作しますが、8000を超える必要があります。誰か私が間違っていることを知っている?

おかげ -dan

注:を私は、具体的ではなく、私が頻繁に見てきたSQL Serverのトリックのいくつかを使用するよりもgroupconcatアグリゲータ機能を持っている必要があります。

答えて

1

はそれを考え出した...ヴィスStudioでソリューションを構築した後、私はそれがCに作成した.dll落ちてきたと仮定すると:\ 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 

それをしないこと。

3

MaxSizeプロパティをSqlFacetAttributeとすると、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); 
} 

これは、任意のより多くの「正しい」あなたがやってしまったものよりもある場合、私は知りませんが、それは、より自然なようです。

+0

非常に有益です。 +1。ありがとう! – DanM

関連する問題