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函數類似的功能。根據所需功能,有多種功能可確保最佳性能......
添加回答
舉報