8

I need a similar function to Oracle WM_CONCAT in SQL Server, which returns a comma separated list of whatever field you pass it as argument. For example, in Oracle,

select WM_CONCAT(first_name) from employee where state='CA' 

returns "John, Jim, Bob".

How can I do this in SQL Server?

Thanks

6 Answers 6

4

In SQL Server 2017 STRING_AGG function has been added

SELECT t.name as TableName
      ,STRING_AGG(c.name, ';') AS FieldList
  FROM sys.tables t
  JOIN sys.columns c 
    ON t.object_id = c.object_id
  GROUP BY t.name;
Sign up to request clarification or add additional context in comments.

Comments

3

The actual answer:

SELECT
   SUBSTRING(buzz, 2, 2000000000)
FROM
    (
    SELECT 
        firstname
    FROM 
        employee
    WHERE
        State = 'CA'
    FOR XML PATH (',')
    ) fizz(buzz)

A common question here. Some searches:

4 Comments

Worth noting this is only valid for SQL Server 2005 and later. OP hasn't stated which version of SQL Server they're using.
You can replace the SUBSTRING, with the STUFF command which will function properly without needing to know the string length.
@Chris J: I would say that SQL 2k5 is a reasonable assumption that 10 years after SQL 2000 RTM and 2.5 versions later
2147483647 is your friend... Memorize it.
2

Try this:


    drop table #mike_temp 
go

select * into #mike_temp 
  from (select 'Ken'  as firstname, 'CO' as state
         union all
        select 'Mike' as firstname, 'CO' as state
         union all
        select 'Tom' as firstname , 'WY' as state
       ) a
go

SELECT distinct 
       state
      ,STUFF((SELECT ', ' + b.firstname FROM #mike_temp b where a.state = b.state FOR XML PATH('')),1, 2, '') AS CSVColumn
  from #mike_temp a

Comments

0

AFAIK, you need to do it by yourself.

You could build an user defined function that loop with a cursor the records of Employee where the state is CA and returns the concatenation of their names.

1 Comment

No, no need to use a CURSOR at all.
0
 SELECT Field1, Substring(Field2, 2, LEN(Field2)) AS Field2 FROM
(
    SELECT
        [InnerData].Field1,
        (SELECT  ',' + Field2 FROM @Fields WHERE Field1=[InnerData].Field1 FOR XML PATH('')) AS Field2
        FROM
        (
            SELECT DISTINCT Field1 FROM @Fields
        ) AS [InnerData]
) AS OuterData

I got this Query from this Link

Refer this Link for more Clarification

Comments

-3

try this

 select    
    wm_concat(name) 
 from
    employee
 where
    state='CA'
 group by
    state

1 Comment

This isn't correct. It doesn't work in SQL Server, as the OP pointed out. You might wish to delete it, or edit it if you meant something different?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.