小编典典

在 Microsoft SQL Server 2005 中模拟 group_concat MySQL 函数?

all

我正在尝试将基于 MySQL 的应用程序迁移到 Microsoft SQL Server 2005(不是选择,但这就是生活)。

在最初的应用程序中,我们 几乎 完全使用了符合 ANSI-SQL 的语句,但有一个明显的例外——我们group_concat相当频繁地使用
MySQL 的函数。

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,所以请在解释过多的情况下犯错:)


阅读 129

收藏
2022-03-30

共1个答案

小编典典

没有真正简单的方法可以做到这一点。不过,那里有很多想法。

我发现的最好的一个

SELECT table_name, LEFT(column_names , LEN(column_names )-1) AS column_names
FROM information_schema.columns AS extern
CROSS APPLY
(
    SELECT column_name + ','
    FROM information_schema.columns AS intern
    WHERE extern.table_name = intern.table_name
    FOR XML PATH('')
) pre_trimmed (column_names)
GROUP BY table_name, column_names;

或者如果数据可能包含字符,则可以正常工作的版本,例如<

WITH extern
     AS (SELECT DISTINCT table_name
         FROM   INFORMATION_SCHEMA.COLUMNS)
SELECT table_name,
       LEFT(y.column_names, LEN(y.column_names) - 1) AS column_names
FROM   extern
       CROSS APPLY (SELECT column_name + ','
                    FROM   INFORMATION_SCHEMA.COLUMNS AS intern
                    WHERE  extern.table_name = intern.table_name
                    FOR XML PATH(''), TYPE) x (column_names)
       CROSS APPLY (SELECT x.column_names.value('.', 'NVARCHAR(MAX)')) y(column_names)
2022-03-30