As we have seen, How to generate Comma separated List in SQL. Today we know, how to get values from Comma separated column. Many times developers asked, How can I read comma separated values from variable? There are many ways to get solution for this. Lets discuss about the best way, I think so. We can use XML to read values from comma separated values. XML made our life easy.
Example:
I have created one procedure which has one parameter VARCHAR(100). This procedure contains the parameter having value like '1,5,6,20'. The requirement is: Update the records having ID = 1,5,6,20 (Any of them). This is the one way that we can prepare the SQL query.
Proposed Solution:
Convert VARCHAR variable to XML as follows:
SET @xmlIDs = '' ' + REPLACE(@str, ',', ' ') + ' ' + '
So this statement will generate XML from VARCHAR value as follows:
1 6 7 8 20
So, Now this is the XML, which can be easily read in SQL SERVER (2005 and above) as:
SELECT x.v.value('.','INT') FROM @xmlIDs.nodes('/IDs/ID') x(v)
This will give me result set as: ( as separate table)
So that’s it, Now I can easily use this result set in my query, to update the rows accordingly.
So my Procedure looks like:
CREATE PROC Test_ReadValuesFromCommaSeparatedVariable @str VARCHAR(100) AS DECLARE @XmlIDs XML SET @xmlIDs = '' UPDATE TableName SET Flag = 1 WHERE ID IN( SELECT x.v.value('.','INT') FROM @xmlIDs.nodes('/IDs/ID') x(v) ) ' + REPLACE(@str, ',', ' ') + ' ' + '
So, it is very easy to read values from Comma separated value.
Let me know if it helps you.
Hey Tejas,
ReplyDeleteIts nice work done by you, its very helpful topic for people.
thanks & keep going...
Keyur Patel
Thank you for this quick and easy method to search with a list! Very helpful!
ReplyDeleteHi..
ReplyDeleteThis is nice..but i needed different output...not like this
Hi Arfan,
ReplyDeletePlease find the same query for your expected result mentioned on: http://tejasnshah.wordpress.com/2009/04/08/sql-server-sql-query-to-find-table-dependencies/
DECLARE @SQLYOga VARCHAR(MAX), @xmlIDs XML
SELECT @SQLYoga = 'a1 - 2 Nos, a2 - 530 Nos, a3 - 2 Boxes'
SET @xmlIDs = '
' + REPLACE(@SQLYOga, ',', '') + '' +
''
SELECT x.v.value('.','VARCHAR(100)')
FROM @xmlIDs.nodes('/IDs/ID') x(v)
Hi,
ReplyDeleteStill i am not able to get my expected result...i having a stored table and having data in a field as
a1- 2nos, a2 -230nos, a3-5nos in a column..i need this column data as
a1 - 2nos
a2 - 230nos
a3 - 5nos
Thanks in advance
Hi Arfaan,
ReplyDeleteCan you please send me your query?
Thanks,
Tejas
SQLYoga.com