Sunday, June 8, 2014

Split column with delimiter into multiple columns

Declare @Delimiter nvarchar(10) = 'enter delimiter'
Declare @InputTable nvarchar(2000) = 'enter input table name'
Declare @OutputTable nvarchar(2000) = 'enter output table name'
Declare @ColumnToSplit nvarchar(2000) = 'enter column to split'


Declare @lsql nvarchar(max)
Declare @treeDepth int

If Object_id('dbo.treeDepth') is not null 
Drop table dbo.treeDepth

CREATE TABLE dbo.treeDepth (depth INT)

declare @ltext nvarchar(max)= 'Select max(1+(len('+@ColumnToSplit+')- len(Replace('+@ColumnToSplit+','''+@Delimiter+''','''')))/(isnull(nullif(len('''+@Delimiter+'''),0),1))) from '+@InputTable

insert dbo.treeDepth EXEC(@ltext)

Select @lsql = isnull(@lsql+',','') + 
'xmlname.value(''/Node[1]/Node['+cast(number+1 as nvarchar)+']'',''varchar(1000)'') AS Col_'+cast(number+1 as nvarchar)+''
from master..spt_values where type = 'P' and number < (Select * from dbo.treeDepth)

set @lsql = '
WITH ForXML
AS
(
    SELECT *,
    CONVERT(XML,''''  
    + REPLACE('+@ColumnToSplit+','''+@Delimiter+''', ''
'') + '''') AS xmlname      FROM '+@InputTable+'
)

Select *, '+@lsql+' Into dbo.'+@OutputTable+' From ForXML


Alter table '+@OutputTable+' 
Drop column xmlname


EXEC(@lsql)

No comments:

Post a Comment