2017-04-06 2 views
0
Begin tran 

create table #user_det 
      (user_id varchar(50), emp_id int, role varchar(500)) 

insert into #user_det (user_id , emp_id , role) 
select 'Sankar', 431544 , '(Developer),(DBA),(Designer)' 
union all 
select 'Gowri', 145721 , '(DBA),(Designer)' 
union all 
select 'Raja', 101010 , 'ALL' 

select * from #user_det 

drop table #user_det 

Rollback 




OutPut Required: 
=============== 

select 'Sankar' as user_id ,431544 as emp_id ,'Developer' as Role 
union all 
select 'Sankar' as user_id ,431544 as emp_id ,'DBA' as Role 
union all 
select 'Sankar' as user_id ,431544 as emp_id ,'Designer' as Role 
union all 
select 'Gowri' as user_id ,145721 as emp_id ,'DBA' as Role 
union all 
select 'Gowri' as user_id ,145721 as emp_id ,'Designer' as Role 
union all 
select 'Raja' as user_id ,101010 as emp_id ,'ALL' as Role 

答えて

0

string_split()を使用できます。

select user_id, emp_id, Role = replace(replace(s.Item,'(',''),')','') 
from #user_det u 
    cross apply dbo.delimitedsplit8K(u.role,',') s 

rextesterデモ:http://rextester.com/YVXGU42109

戻り値:

+---------+--------+-----------+ 
| user_id | emp_id | Role | 
+---------+--------+-----------+ 
| Sankar | 431544 | Developer | 
| Sankar | 431544 | DBA  | 
| Sankar | 431544 | Designer | 
| Gowri | 145721 | DBA  | 
| Gowri | 145721 | Designer | 
| Raja | 101010 | ALL  | 
+---------+--------+-----------+ 

分割ストリングが参照ジェフMODENによってCSVスプリッタテーブル値関数を使用してSQL Serverプレ2016年


delimitedsplit8KジェフMODENによって機能:

create function [dbo].[delimitedsplit8K] (
     @pstring varchar(8000) 
    , @pdelimiter char(1) 
) 
returns table with schemabinding as 
return 
    with e1(N) as (
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all 
    select 1 union all select 1 union all select 1 union all select 1 
) 
    , e2(N) as (select 1 from e1 a, e1 b) 
    , e4(N) as (select 1 from e2 a, e2 b) 
    , ctetally(N) as (
    select top (isnull(datalength(@pstring),0)) 
     row_number() over (order by (select null)) from e4 
) 
    , ctestart(N1) as (
    select 1 union all 
    select t.N+1 from ctetally t where substring(@pstring,t.N,1) = @pdelimiter 
) 
    , ctelen(N1,L1) as (
    select s.N1, 
     isnull(nullif(charindex(@pdelimiter,@pstring,s.N1),0)-s.N1,8000) 
    from ctestart s 
) 
select itemnumber = row_number() over(order by l.N1) 
     , item  = substring(@pstring, l.N1, l.L1) 
    from ctelen l 
; 
go 
+0

こんにちはSqlZimあなたの答えをありがとう。しかし、私はSQL Server 2012のバージョンでこれが必要です。 –

+0

@SankarMこれはSQL Server 2012で動作します。あなたが2016年の場合、メモは別のものです。 – SqlZim

+0

それを入手しました。ありがとうございました。その関数を使用せずに単一のクエリで書き込む可能性はありますか? –

1

SqlZimがにリンクされて誰もが良いスプリット/解析機能を持っている必要があります。あなたは

Select A.user_id 
     ,A.emp_id 
     ,[role] = Replace(Replace(B.RetVal,')',''),'(','') 
From #user_det A 
Cross Apply (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
         ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>' + replace((Select replace(A.[Role],',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as X 
       Cross Apply x.nodes('x') AS B(i) 
      ) B 

を望んでいないか、UDF

を使用することができない場合はここで

は別のオプションです戻り

enter image description here

関連する問題