gpt4 book ai didi

sql-server - SQL Server 2008 中的用户定义聚合 - 如何使用 MaxByteSize = -1 进行部署?

转载 作者:行者123 更新时间:2023-12-01 13:08:57 25 4
gpt4 key购买 nike

我读了here (和其他地方)在 SQL Server 2008 中,可以构建一个用户定义的聚合,它可以返回一个超过 8000 个字符的字符串。这正是我需要的。

据推测,该方法是将 maxByteSize 设置为 -1 而不是数字 btw 1 和 8000;这应该允许最大 2GB 的任何大小。

显然,出于某种原因,如果您使用此设置,则不能直接从 Visual Studio 2008 进行部署;所以你需要手动部署。

因此:我构建了我的项目 - GroupConcat(它应该模拟 MySQL 的 group_concat 聚合器) - 它在项目的 bin 文件夹中为我提供了一个文件“SqlClassLibrary.dll”。根据上述链接页面上的说明,我在 SQL Server 中构建程序集。命令执行成功。但是,当我尝试实际使用 groupconcat 聚合器时:

选择部门,dbo.groupconcat(projectNumber) from projectleads group by department

...它说找不到。如果我将 maxByteSize 设置为 8000 并直接从 VS2008 中部署,这一切都很好,但我需要 >8000。有人知道我做错了什么吗?

谢谢-丹

注意:我确实特别需要一个 groupconcat 聚合器函数,而不是使用一些我经常看到的 SQL Server 技巧。

最佳答案

或者,您可以使用 SqlFacetAttributeMaxSize 属性来指示 varchar 大小。请注意,在下面的示例中,我将此属性应用于 Accumulate 方法中的 SqlString 参数以及 Terminate 方法的返回值。这导致以下 SQL 签名:

AGGREGATE [dbo].[Concatenate] (@value nvarchar(max), @order int, @seperator nvarchar(max)) 返回 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);
}

我不知道这是否比您最终所做的更“正确”,但它看起来更自然。

关于sql-server - SQL Server 2008 中的用户定义聚合 - 如何使用 MaxByteSize = -1 进行部署?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/622218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com