我正在尝试将基于MySQL的应用程序迁移到Microsoft SQL Server 2005(不是选择,而是生活) .
在原始应用程序中,我们几乎完全使用符合ANSI-SQL的语句,但有一个重要的例外 - 我们相当频繁地使用了MySQL的 group_concat
函数 .
顺便提一下, group_concat
这样做:给出一张表,比如说员工姓名和项目......
SELECT empName, projID FROM project_members;
收益:
ANDY | A100
ANDY | B391
ANDY | X010
TOM | A100
TOM | A510
...这是你用group_concat得到的:
SELECT
empName, group_concat(projID SEPARATOR ' / ')
FROM
project_members
GROUP BY
empName;
收益:
ANDY | A100 / B391 / X010
TOM | A100 / A510
所以我想知道的是:是否有可能在SQL Server中编写用户定义的函数来模拟 group_concat
的功能?
我几乎没有使用UDF,存储过程或类似的东西的经验,只是直接的SQL,所以请错误地说太多的解释:)
9 回答
没有真正简单的方法来做到这一点 . 不过,那里有很多想法 .
Best one I've found:
或者,如果数据可能包含
<
等字符,则该版本可正常工作我可能会晚一点,但这种方法适合我,比COALESCE方法更容易 .
现在可能为时已晚,但这不是最简单的做事方式吗?
SQL Server 2017 确实引入了新的聚合函数
STRING_AGG ( expression, separator) .
可以通过附加
WITHIN GROUP (ORDER BY some_expression)
来排序连接元素For versions 2005-2016 我通常在接受的答案中使用XML方法 .
然而,在某些情况下这可能会失败 . 例如如果要连接的数据包含
CHAR(29)
,你会看到可以处理所有字符的更健壮的方法是使用CLR聚合 . 然而,使用这种方法对连接元素应用排序更加困难 .
分配给变量的方法是not guaranteed,应该在 生产环境 代码中避免使用 .
看看Github上的GROUP_CONCAT项目,我想我的确是你正在寻找的:
要连接具有多个项目经理的项目中的所有项目经理名称,请执行以下操作:
使用以下代码,您必须在部署之前在项目属性上设置PermissionLevel = External,并通过运行“ALTER DATABASE database_name SET”将数据库更改为信任外部代码(确保在其他地方读取有关安全风险和替代方案[如证书])值得信赖的“ .
我已使用如下查询对此进行了测试:
产量:A,B,C,D
试过这些但是为了我在MS SQL Server 2005中的目的,以下是最有用的,我在xaprb找到了
@Mark正如你所提到的那样,空间角色给我带来了问题 .
关于J Hardiman的回答,怎么样:
顺便说一下,使用“Surname”是一个错字还是我不理解这里的概念?
无论如何,非常感谢大家,因为它节省了我很多时间:)