I’m trying to migrate a MySQL-based app over to Microsoft SQL Server 2005 (not by choice, but that’s life).
In the original app, we used almost entirely ANSI-SQL compliant statements, with one significant exception — we used MySQL’s group_concat
function fairly frequently.
group_concat
, by the way, does this: given a table of, say, employee names and projects…
SELECT empName, projID FROM project_members;
returns:
ANDY | A100 ANDY | B391 ANDY | X010 TOM | A100 TOM | A510
… and here’s what you get with group_concat:
SELECT empName, group_concat(projID SEPARATOR ' / ') FROM project_members GROUP BY empName;
returns:
ANDY | A100 / B391 / X010 TOM | A100 / A510
So what I’d like to know is: Is it possible to write, say, a user-defined function in SQL Server which emulates the functionality of group_concat
?
I have almost no experience using UDFs, stored procedures, or anything like that, just straight-up SQL, so please err on the side of too much explanation 🙂
Advertisement
Answer
No REAL easy way to do this. Lots of ideas out there, though.
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;
Or a version that works correctly if the data might contain characters such as <
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)