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

  • 相关阅读:
    LeetCode 842. Split Array into Fibonacci Sequence
    LeetCode 1087. Brace Expansion
    LeetCode 1219. Path with Maximum Gold
    LeetCode 1079. Letter Tile Possibilities
    LeetCode 1049. Last Stone Weight II
    LeetCode 1046. Last Stone Weight
    LeetCode 1139. Largest 1-Bordered Square
    LeetCode 764. Largest Plus Sign
    LeetCode 1105. Filling Bookcase Shelves
    LeetCode 1027. Longest Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/grj001/p/12224889.html
Copyright © 2011-2022 走看看