64

Right now, I have a SQL Query like this one:

SELECT X, Y FROM POINTS

It returns results like so:

X    Y
----------
12   3
15   2
18   12
20   29

I'd like to return results all in one row, like this (suitable for using in an HTML <AREA> tag):

XYLIST
----------
12,3,15,2,18,12,20,29

Is there a way to do this using just SQL?

3
  • If you want your application to scale, it would be better to do this kind of thing outside the database. The database will almost always be your bottleneck. Commented Oct 7, 2008 at 19:51
  • I wonder why the good answer went away? Commented Oct 7, 2008 at 20:01
  • @Joseph Bui - Believe me, I know. Unfortunately the project lead insists I do it this way. Commented Oct 7, 2008 at 20:27

5 Answers 5

105

Thanks for the quick and helpful answers guys!

I just found another fast way to do this too:

SELECT  STUFF(( SELECT ',' + X + ',' + Y
                FROM Points
              FOR
                XML PATH('')
              ), 1, 1, '') AS XYList

Credit goes to this guy:

Link

Sign up to request clarification or add additional context in comments.

2 Comments

I really like this solution the most. Easy to use and only one line to add in any SQL.
Note: This method causes special characters to be replaced by their XML equivalent. IOW, Barnes & Noble becomes Barnes &amp; Noble
31
DECLARE @XYList varchar(MAX)
SET @XYList = ''

SELECT @XYList = @XYList + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y) + ','
FROM POINTS

-- Remove last comma
SELECT LEFT(@XYList, LEN(@XYList) - 1)

1 Comment

Is it me or doesn't this work on a linked server? When i try something like SELECT @List = @List + CONVERT(varchar, ID) + ',' FROM LinkedServer.MyDatabase.dbo.MyTable it always returns only one ID. A Select * returns many ID's.
28

Starting in SQL 2017, you can use STRING_AGG

SELECT STRING_AGG (X + ',' + Y, ',') AS XYLIST
FROM POINTS

https://learn.microsoft.com/en-us/sql/t-sql/functions/string-agg-transact-sql?view=sql-server-2017

Comments

15

Using the COALESCE trick, you don't have to worry about the trailing comma:

DECLARE @XYList AS varchar(MAX) -- Leave as NULL

SELECT @XYList = COALESCE(@XYList + ',', '') + CONVERT(varchar, X) + ',' + CONVERT(varchar, Y)
FROM POINTS

Comments

2
DECLARE @s VarChar(8000)
SET @s = ''

SELECT @s = @s + ',' + CAST(X AS VarChar) + ',' + CAST(Y AS VarChar) 
FROM POINTS

SELECT @s 

Just get rid of the leading comma

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.