zoukankan      html  css  js  c++  java
  • Sqlserver 2014 之 自定义字符串聚合函数

    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

  • 相关阅读:
    Linux 下安装配置 JDK7
    win7下virtualbox装linux共享win7文件问题(已测试可用)
    Linix常用命令
    JAVA命令大全
    virtualbox 不能为虚拟电脑打开一个新任务/VT-x features locked or unavailable in MSR.
    VirtualBox下安装rhel5.5 linux系统
    redhat RHEL 5.5 下载地址
    ios开发@selector的函数如何传参数/如何传递多个参数
    U盘10分钟安装linux系统
    史上最浅显易懂的Git分布式版本控制系统教程
  • 原文地址:https://www.cnblogs.com/grj001/p/12224888.html
Copyright © 2011-2022 走看看