在Microsoft SQL Server 2005中使用concat MySQL函数?
我正尝试将基于MySQL的应用程序迁移到Microsoft SQL Server 2005(不是通过选择,但是这是生活)。
在原来的应用程序中,我们几乎完全使用了符合ANSI-SQL的语句,但有一个明显的例外 - 我们经常使用MySQL的group_concat
函数。
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)
我可能对晚会有点迟,但这种方法适用于我,比COALESCE方法更容易。
SELECT STUFF(
(SELECT ',' + Column_Name
FROM Table_Name
FOR XML PATH (''))
, 1, 1, '')
现在可能已经太晚了,但这不是最简单的方法吗?
SELECT empName, projIDs = replace
((SELECT Surname AS [data()]
FROM project_members
WHERE empName = a.empName
ORDER BY empName FOR xml path('')), ' ', REQUIRED SEPERATOR)
FROM project_members a
WHERE empName IS NOT NULL
GROUP BY empName
链接地址: http://www.djcxy.com/p/7721.html