In this post, we will learn how to display comma separated value row wise in SQL Server
Example-1: Comma separated values of a variable to rows
In the first Example we will take a variable which holds some values with comma separator and we will display each value in a row.
Step 1: Replace comma with tag from comma separated value list to make it as XML
Step 2: Read each node from XML and display value in rows
Example-2: Comma separated values of a column to rows
In this example, we have two columns Col1 & Col2 in a table and Col2 stores comma separated values and our requirement is to display each value of Col2 in row form against Col1
Step 1: Replace comma with tag from comma separated value list to make it as XML
Step 2: Reading each node from the XML
Step 3: Cross Apply to generated each node value as row.
Suggested article to understand Cross Apply: APPLY Operator in SQL Server
Now let's transform the above code into a table valued function to make it reusable and flexible.
Now, In the above table valued function we have to just pass delimited string and delimiter and it will return you a table with two columns id (sequential number) and val (all delimited value).
Delimiter could be any : Comma, Colon, Semi-Colon etc.
Suggested article to understand split function in detail: Split Function in SQL
Now, let's execute the table valued function with different delimiters
Example-1: Comma separated values of a variable to rows
In the first Example we will take a variable which holds some values with comma separator and we will display each value in a row.
Step 1: Replace comma with tag from comma separated value list to make it as XML
Step 2: Read each node from XML and display value in rows
DECLARE @xml XML, @s NVARCHAR(MAX)
SELECT @s = N'a,b,c,d,e'
SET @xml = N'<t>' + REPLACE(@s,',','</t><t>') + '</t>'
SELECT t.value('.','varchar(5)') as [delimited items]
FROM @xml.nodes('/t') as a(t)
OUTPUT
Example-2: Comma separated values of a column to rows
In this example, we have two columns Col1 & Col2 in a table and Col2 stores comma separated values and our requirement is to display each value of Col2 in row form against Col1
Step 1: Replace comma with tag from comma separated value list to make it as XML
Step 2: Reading each node from the XML
Step 3: Cross Apply to generated each node value as row.
Suggested article to understand Cross Apply: APPLY Operator in SQL Server
DECLARE @TAB TABLE (col1 varchar(10), col2 varchar(10))
INSERT INTO @TAB
SELECT 'A' as col1, '1,2,3' as col2
UNION
SELECT 'B' as col1, '4,5,6' as col2
SELECT col1, Tags.val.value('.', 'VARCHAR(MAX)') AS col2
FROM(
SELECT col1, CAST('<t>' + REPLACE(col2, ',', '</t><t>') + '</t>' AS XML) AS TAG
FROM @TAB
) T CROSS APPLY TAG.nodes('/t') as Tags(val)
OUTPUT
Now let's transform the above code into a table valued function to make it reusable and flexible.
CREATE FUNCTION Split(
@delimited NVARCHAR(MAX),
@delimiter NVARCHAR(100)
) RETURNS @t TABLE (id INT IDENTITY(1,1), val NVARCHAR(MAX))
AS
BEGIN
DECLARE @xml XML
SET @xml = N'<t>' + REPLACE(@delimited,@delimiter,'</t><t>') + '</t>'
INSERT INTO @t(val)
SELECT r.value('.','varchar(MAX)') as item
FROM @xml.nodes('/t') as records(r)
RETURN
END
Now, In the above table valued function we have to just pass delimited string and delimiter and it will return you a table with two columns id (sequential number) and val (all delimited value).
Delimiter could be any : Comma, Colon, Semi-Colon etc.
Suggested article to understand split function in detail: Split Function in SQL
Now, let's execute the table valued function with different delimiters
SELECT * FROM dbo.Split(N'a,b,c', ',') SELECT * FROM dbo.Split(N'p:q:r', ':')OUTPUT
No comments:
Write Comments