0

How to split a single row into multiple row ?

DECLARE @var VARCHAR(50)
SELECT @Var = 'brook|456|US'

SELECT SPLIT(@var)

Result:

brook
456
US 
Karlx Swanovski
  • 2,869
  • 9
  • 34
  • 67
  • http://sqlperformance.com/2012/07/t-sql-queries/split-strings & http://sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql – Aaron Bertrand Nov 19 '14 at 03:09

2 Answers2

0

Using a tally table:

declare @parameter varchar(4000)
set @parameter = 'brook|456|US'
set @parameter = '|' +  @parameter + '|' -- add delimiter

;with 
    e1 as(select 1 as N union all select 1), -- 2 rows
    e2 as(select 1 as N from e1 as a, e1 as b), -- 4 rows
    e3 as(select 1 as N from e2 as a, e2 as b), -- 16 rows
    e4 as(select 1 as N from e3 as a, e3 as b), -- 256 rows
    tally as (select row_number() over(order by N) as N from e4
)
    select 
        substring(@parameter, N+1, charindex('|', @parameter, N+1) - N-1)
    from tally
    where 
        N < len(@parameter)
        and substring(@parameter, N, 1) ='|'
Felix Pamittan
  • 31,544
  • 7
  • 41
  • 67
0

Try this. You need to create a Table Valed Function not a Scalar Function

CREATE FUNCTION dbo.Split (@ip_string VARCHAR(5000),@delimiter char(1))
returns TABLE
AS
    RETURN
      (SELECT Split.a.value('.', 'VARCHAR(100)') Split_col
       FROM   (SELECT Cast ('<M>' + Replace(@ip_string, @delimiter, '</M><M>')
                            + '</M>' AS XML) AS Data) AS A
              CROSS APPLY Data.nodes ('/M') AS Split(a))

go

DECLARE @var VARCHAR(50)
SELECT @Var = 'brook|456|US'

SELECT * FROM   dbo.Split(@var,'|') 

Output :

+===========+
| Split_col | 
+===========+
| brook     |
+-----------+
| 456       |  
+-----------+
| US        |
+-----------+
Pரதீப்
  • 91,748
  • 19
  • 131
  • 172