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

时间:2009-03-07 17:58:07

标签: sql-server sql-server-2008 clr user-defined-aggregate

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

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

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

所以:我构建我的项目 - 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

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

2 个答案:

答案 0 :(得分:3)

或者,您可以使用MaxSize的{​​{1}}属性来指示varchar大小。请注意,在下面的示例中,我将此属性应用于SqlFacetAttribute方法中的SqlString参数以及Accumulate方法的返回值。这会产生以下SQL签名:

Terminate

AGGREGATE [dbo].[Concatenate] (@value nvarchar(max), @order int, @seperator nvarchar(max)) RETURNS nvarchar(max)

我不知道这是否比你最后做的更“正确”,但似乎更自然。

答案 1 :(得分:1)

想出来......在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

就是这样。