我正在尝试将基于 MySQL 的应用程序迁移到 Microsoft SQL Server 2005(不是选择,但这就是生活)。
在最初的应用程序中,我们 几乎 完全使用了符合 ANSI-SQL 的语句,但有一个明显的例外——我们group_concat相当频繁地使用 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,所以请在解释过多的情况下犯错:)
没有真正简单的方法可以做到这一点。不过,那里有很多想法。
我发现的最好的一个:
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)