Sqlserver 2014 之 自定义字符串聚合函数

最近做的一个HR项目需要同时支持两种数据库(Postgresql and Sqlserver 2014)
但是有一个问题困扰了我,就项目中需要在group 中去聚合一些字符串。

在postgresql 中可以使用内部函数string_agg(filedName, 分割符) 来实现,但是sqlserver 没有这种直接的聚合函数,但是sqlserver 2005以后就支持自定义聚合函数(适用C#进行编码)。
看看实现步骤吧:
1. 在visual studio 2013 中新建一个sqlserver项目。
2. 在新建的sqlserver项目上右键--添加--新项目,然后选择SQL CLR C# ---- SQL CLR C# 用户自定函数, 设置好文件名后点击右下角添加按钮。

3.编写C#代码,代码请参考附件String_agg.7z, 然后编译代码,编译之后会在工程目录obj\Debug生成一个SQL_STRING_AGG.dll 文件(sqlserver 项目名),然后把这个文件拷贝到D盘。(黄色的地方的盘符要一致)

4. 启动sqlserver,连接数据库之后,启动sqlserver 2014的CLR功能

    4.1 启动顺序如下:

          数据库实例右键--方面 会弹出一个窗口,在方面里面选择服务器配置---方面属性---                   clrIntegerationEnabled 设置成 true。(这个必须开启)

5. 执行以下两组sql,创建程序集和聚合函数。
CREATE ASSEMBLY [SQL_STRING_AGG] AUTHORIZATION [dbo]

FROM 'd:\SQL_STRING_AGG.dll'

WITH PERMISSION_SET = SAFE;

GO

 

CREATE AGGREGATE [dbo].[String_agg] (@FieldValue [nvarchar](4000), @Delimiter [nvarchar](4000))

RETURNS [nvarchar](4000)

EXTERNAL NAME [SQL_STRING_AGG].[String_agg];

GO

OK, 完成以上步骤就可以实现以下聚合功能了

表 person:

name            value
张三              12

张三              34

张三              56

张三              78

张三              90
select name, dbo.string_agg(value,',') as group_values from person group by name order name

输出:张三  |  12,34,56,,78,90

你可能感兴趣的:(sqlserver)