5 回答
TA贡献1810条经验 获得超4个赞
没有真正简单的方法来做到这一点。不过,那里有很多想法。
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)
TA贡献2019条经验 获得超9个赞
我可能会晚一点,但这种方法适合我,比COALESCE方法更容易。
SELECT STUFF( (SELECT ',' + Column_Name FROM Table_Name FOR XML PATH ('')) , 1, 1, '')
TA贡献1827条经验 获得超9个赞
现在可能为时已晚,但这不是最简单的做事方式吗?
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
TA贡献1785条经验 获得超8个赞
SQL Server 2017确实引入了新的聚合函数
STRING_AGG ( expression, separator)
。
连接字符串表达式的值并在它们之间放置分隔符值。字符串末尾不添加分隔符。
可以通过附加来排序连接元素 WITHIN GROUP (ORDER BY some_expression)
对于2005-2016版本,我通常在接受的答案中使用XML方法。
然而,在某些情况下这可能会失败。例如,如果要连接的数据包含CHAR(29)
您看到的内容
FOR XML无法序列化数据...因为它包含XML中不允许的字符(0x001D)。
可以处理所有字符的更健壮的方法是使用CLR聚合。然而,使用这种方法对连接元素应用排序更加困难。
分配给变量的方法不能保证,应该在生产代码中避免。
TA贡献1712条经验 获得超3个赞
看看Github 上的GROUP_CONCAT项目,我想我的确是你正在寻找的:
该项目包含一组SQLCLR用户定义聚合函数(SQLCLR UDA),它们共同提供与MySQL GROUP_CONCAT函数类似的功能。根据所需功能,有多种功能可确保最佳性能......
添加回答
举报