sql - How to create rows based on one column values comma seperated -


begin tran  create table #user_det               (user_id varchar(50), emp_id int, role varchar(500))  insert #user_det (user_id , emp_id , role) select 'sankar', 431544 , '(developer),(dba),(designer)' union select 'gowri', 145721 , '(dba),(designer)' union select 'raja', 101010 , 'all'  select * #user_det  drop table #user_det  rollback     output required: ===============  select 'sankar' user_id ,431544 emp_id ,'developer' role union select 'sankar' user_id ,431544 emp_id ,'dba' role union select 'sankar' user_id ,431544 emp_id ,'designer' role union select 'gowri' user_id ,145721 emp_id ,'dba' role union select 'gowri' user_id ,145721 emp_id ,'designer' role union select 'raja' user_id ,101010 emp_id ,'all' role 

in sql server 2016+ can use string_split().

in sql server pre-2016, using csv splitter table valued function jeff moden:

select user_id, emp_id, role = replace(replace(s.item,'(',''),')','') #user_det u   cross apply dbo.delimitedsplit8k(u.role,',') s 

rextester demo: http://rextester.com/yvxgu42109

returns:

+---------+--------+-----------+ | user_id | emp_id |   role    | +---------+--------+-----------+ | sankar  | 431544 | developer | | sankar  | 431544 | dba       | | sankar  | 431544 | designer  | | gowri   | 145721 | dba       | | gowri   | 145721 | designer  | | raja    | 101010 |       | +---------+--------+-----------+ 

splitting strings reference:


delimitedsplit8k function jeff moden:

create function [dbo].[delimitedsplit8k] (       @pstring varchar(8000)     , @pdelimiter char(1)   ) returns table schemabinding  return   e1(n) (     select 1 union select 1 union select 1 union      select 1 union select 1 union select 1 union      select 1 union select 1 union select 1 union select 1   )   , e2(n) (select 1 e1 a, e1 b)   , e4(n) (select 1 e2 a, e2 b)   , ctetally(n) (     select top (isnull(datalength(@pstring),0))        row_number() on (order (select null)) e4   )   , ctestart(n1) (     select 1 union     select t.n+1 ctetally t substring(@pstring,t.n,1) = @pdelimiter   )   , ctelen(n1,l1) (     select s.n1,       isnull(nullif(charindex(@pdelimiter,@pstring,s.n1),0)-s.n1,8000)     ctestart s   )  select itemnumber = row_number() over(order l.n1)       , item       = substring(@pstring, l.n1, l.l1)    ctelen l ; go 

Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -