WiseOwl Training - Established 1992 Wise Owl Training

Established May 1992
30 years in business
Wise Owl Training
30 years in business
See 520 reviews for our classroom and online training
The new SQL String_Split function for comma-delimited strings
If you're using SQL Server with compatibility level 130 or greater you can now use the new String_Split function to divide a comma-delimited string into a table of values.

Posted by Andy Brown on 22 March 2021

You need a minimum screen resolution of about 700 pixels width to see our blogs. This is because they contain diagrams and tables which would not be viewable easily on a mobile phone or small laptop. Please use a larger tablet, notebook or desktop computer, or change your screen resolution settings.

The new SQL String_Split function for comma-delimited strings

This is a subject which won't move many people, but means a lot to me!  Here's a table:

Table of questions

A few of the 720,000+ skills assessment tests which have been started on our website.

Database geeks: please don't have a go at us for storing our data in denormalised form like this (I'm sure we had good reasons at the time).

So previously if I wanted to get at the table of questions or answers for a particular test, I'd have to use a table-defined function like this one.  No longer!

The basic syntax of the new String_Split function

Users of SQL Server databases with compatibility level 130 or higher (see below for how to determine your compatibility level - in practice you'll need to be using SQL Server 2016 or later) can now use the String_Split function which takes two arguments:

Number Argument
1 The string of text you want to split
2 The delimiter (often a comma, as for the example above)

Here's a really simple example:

Simple split

This simple query splits the phrase Wise Owl Training into three words.

Here's another example using a comma as a delimiter:

-- split a shopping list by commas


value AS Fruit






This would return the empty items also, so it might be an idea to add a WHERE clause to strip these out:

Removing blank items

There may be better ways to do this, but I just added WHERE LEN(LTRIM(RTRIM(value))) > 0 to my query to get rid of the blank rows.


String_Split returns a table

The String_Split function returns a table of data, which means that a query like this won't work:

String_split not working

The message here is really misleading: the function does exist, but can't be used as if it returns a single value (or scalar).

To prove this, if you use a subquery to count the number of rows returned from the call to this function for each row, it will work:

-- show the questions for each test

-- taken in 2021





FROM String_Split(t.QuestionString,',')

) AS NumberQuestions


tblTest as t


YEAR(t.DateCreated) = 2021

This would give output like this:

Results of query

Most of our skills assessment tests contain 20 questions.


to get a list of the questions for each test for our example you could use the CROSS APPLY join:

-- show the questions for each test

-- taken in 2021



value AS QuestionNumber


tblTest as t

CROSS APPLY String_Split(t.QuestionString,',')


YEAR(t.DateCreated) = 2021

This would put each question number for each test on a separate row:

Questions listed

There will now be a list of the 20 question numbers for each test number.


The String_Split function always returns a single column, which SQL always gives the name value.

Checking your database's compatibility level

To do this, right-click on your database's name in Management Studio:

Showing database properties

Right-click on the name of a database and choose Properties, as shown.


You can then see (and change) your database's compatibility level on the Options tab:

Database options

Phew - this database is already on compatibility level 130 or higher.

This blog has 0 threads Add post