You can do this using xml and cross apply.
See the following:
DECLARE @t table (ID int, Name varchar(20), City varchar(20), Items varchar(max)); INSERT @t SELECT 1,'Michael','Miami' ,'item|item2|item3|item4|item5' UNION SELECT 2,'Jorge' ,'Hallandale','item|item2|item3|item4|item5' DECLARE @u table (UserID int identity(1,1), Name varchar(20), City varchar(20)); INSERT @u (Name, City) SELECT DISTINCT Name, City FROM @t DECLARE @i table (ItemID int identity(1,1), UserID int, Name varchar(20)); WITH cte_Items (Name, Items) as ( SELECT Name ,CAST(REPLACE('<r><i>' + Items + '</i></r>','|','</i><i>') as xml) as Items FROM @t ) INSERT @i (UserID, Name) SELECT u.UserID ,s.Name as Name FROM cte_Items t CROSS APPLY (SELECT i.value('.','varchar(20)') as Name FROM t.Items.nodes('//r/i') as x(i) ) s INNER JOIN @uu ON t.Name = u.Name SELECT * FROM @i
More details here: http://www.kodyaz.com/articles/t-sql-convert-split-delimeted-string-as-rows-using-xml.aspx
source share