113

I want to create a table valued function in SQL Server, which I want to return data in comma separated values.

For example table: tbl

ID | Value
---+-------
 1 | 100
 1 | 200
 1 | 300     
 1 | 400 

Now when I execute the query using the function Func1(value)

SELECT Func1(Value) 
FROM tbl 
WHERE ID = 1

Output that I want is: 100,200,300,400

6
  • And your question is? Commented Feb 13, 2014 at 17:17
  • 1
    Why is ID 1 for all rows? Usually ID is a Primary Key and is usually unique for each row. Commented Feb 13, 2014 at 17:18
  • SELECT Func1(Value) FROM tbl WHERE ID = 1 output: 100,200,300,400 Commented Feb 13, 2014 at 17:19
  • 1
    The answer you want is here: stackoverflow.com/questions/194852/… Commented Feb 13, 2014 at 17:20
  • 1
    A "splitter" would do the opposite .. split a single value apart to multiple values. Commented Feb 13, 2014 at 17:38

1 Answer 1

253

Test Data

DECLARE @Table1 TABLE(ID INT, Value INT)
INSERT INTO @Table1 VALUES (1,100),(1,200),(1,300),(1,400)

Query

SELECT  ID
       ,STUFF((SELECT ', ' + CAST(Value AS VARCHAR(10)) [text()]
         FROM @Table1 
         WHERE ID = t.ID
         FOR XML PATH(''), TYPE)
        .value('.','NVARCHAR(MAX)'),1,2,' ') List_Output
FROM @Table1 t
GROUP BY ID

Result Set

╔════╦═════════════════════╗
║ ID ║     List_Output     ║
╠════╬═════════════════════╣
║  1 ║  100, 200, 300, 400 ║
╚════╩═════════════════════╝

SQL Server 2017 and Later Versions

If you are working on SQL Server 2017 or later versions, you can use built-in SQL Server Function STRING_AGG to create the comma delimited list:

DECLARE @Table1 TABLE(ID INT, Value INT);
INSERT INTO @Table1 VALUES (1,100),(1,200),(1,300),(1,400);


SELECT ID , STRING_AGG([Value], ', ') AS List_Output
FROM @Table1
GROUP BY ID;

Result Set

╔════╦═════════════════════╗
║ ID ║     List_Output     ║
╠════╬═════════════════════╣
║  1 ║  100, 200, 300, 400 ║
╚════╩═════════════════════╝
Sign up to request clarification or add additional context in comments.

4 Comments

How can i use newline instead of ',' for separating the values?
I think it would be better to use the "COALESCE" function.
@A.R. what you actually meant to say: Microsoft's (non-)implementation of this and people's resulting workarounds are terrible by necessity. Don't just blame an amorphous 'all SQL' that doesn't practically exist.
This works but only issue is if you have "&" in your comma separated values (here List_Output) it will be converted to "&amp;" similarly with "<" &">".

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.