Split Function in SQL

The purpose of split function (table valued function) is to split a delimited value into multiple values based on delimiter and display in tabular form.

Split Function takes two parameters
  • Delimited Value: The delimited value to be split in multiple values.
  • Delimiter: The delimiter like comma, colon, semicolon, pipe etc. on the basis of which delimited value to be split.
and returns table of multiple values delimited on the basis of delimiter.
CREATE FUNCTION dbo.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

Step wise explanation of split Function
  • Converting the delimited value into XML using replace function, where all delimiters are getting replaced with tag to make it as XML and assigning the same to XML Variable
  • Reading the Node from XML variable and storing the values in table variable @t.
  • Returning the table variable @t

Let's take an example to split a comma delimited value into multiple values on the basis of delimiter (comma) using split function.
SELECT * FROM dbo.split('val1,val2,val3', ',')
RESULT

Now let's take another example where you have multiple delimited value stored in a table against an ID and each value needs to split on the basis of delimiter.

We would be using Cross Apply  clause in the example.
DECLARE @TAB TABLE(
    id int, list varchar(100)
)
INSERT INTO @TAB
SELECT 1, 'apple;banana;grapes;orange'
UNION ALL SELECT 2, 'potato;onion;carrot;brinjal'
SELECT * FROM @TAB
SELECT    t.id, s.val
FROM    @TAB t
CROSS APPLY dbo.split(t.list, ';') s
RESULT

I am a Software Engineer and passionate programmer. Love working in SQL Server. Like participating in online technical communities like asp.net, MSDN, technical discussions and helping my friends, colleagues and others in their technical problems

Previous
Next Post »

8 comments

comments
November 25, 2013 at 1:22 PM delete

Hi
Found this article helpful in resolving imports from old system, what i need to know is if you can use something similar on multiple columns instead of just one

Reply
avatar
November 25, 2013 at 4:13 PM delete

Use split function for each list and join on id

Reply
avatar
November 29, 2013 at 1:08 PM delete

Hi one more question, I have a column with values "21:20~21:28~21:28~21:40~21:40~21:40~21:42" ie tilde delim, that I now need to split into separate columns for each value. Suggestions?

Reply
avatar
Louis van Rooyen
July 25, 2015 at 10:14 AM delete

Than You, was hoping not to

Reply
avatar
July 25, 2015 at 10:14 AM delete

Hi,
This is only one value for the column. I guess, there would be many different values. How would
you generate columns for each value?


However after using split function you can use dynamic pivot to generate columns.
Refer http://bit.ly/12pEG93 for dynamic pivot.

Reply
avatar
Louis van Rooyen
July 25, 2015 at 10:14 AM delete

Hi, thank You, it seems to be the accepted way of doing it, very much appreciated

Reply
avatar

.