SQL Server 2008のユーザー定義集計-MaxByteSize = -1で展開する方法
-
05-07-2019 - |
質問
こちらを読みました(および他の場所)では、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);
}
これがもう「正しい」かどうかわかりません。あなたがやったことよりも、それはより自然に思えます。