在 SQL Server 2016 中解析字符串

Parse string in SQL Server 2016

我的存储过程中有一个分号分隔的字符串变量,其内容在下面的引号中显示,短语和名称由两个破折号“--”分隔。

下面的字符串变量。

Outside Hire--Hire #01; Reassignment - External--Hire #15; Reassignment - External--Hire #21; Outside Hire--Hire #03; Internal Reassignment--John Pen; Outside Hire--Kara Emma

我想对其进行解析,使其在方括号中显示与每个短语相关联的名称,用逗号分隔,以及该短语出现的次数。结果示例如下所示。

结果

3 Outside Hire(Hire #01, Hire #03, Kara Emma); 2 Reassignment - External(Hire #15, Hire #21); 1 Internal Reassignment(John Pen)

有点难看,但也许这会有所帮助

例子

Declare @S varchar(max) = 'Outside Hire--Hire #01; Reassignment - External--Hire #15; Reassignment - External--Hire #21; Outside Hire--Hire #03; Internal Reassignment--John Pen; Outside Hire--Kara Emma'

;with cte as (
Select Cnt=sum(1) over (Partition By Pos1)
      ,Pos1
      ,Pos2
 From  string_split(@S,';') A
 Cross Apply (
                Select Pos1 = trim(JSON_VALUE(S,'$[0]'))
                      ,Pos2 = trim(JSON_VALUE(S,'$[1]'))
                 From  ( values ( '["'+replace(replace(Value,'"','\"'),'--','","')+'"]' ) ) A(S)
             ) B
),  cte2 as (
Select Distinct TmpStr = concat(A.cnt,' ',Pos1,'(',Stuff((Select ', ' +Pos2 From cte Where Pos1=A.Pos1 For XML Path ('')),1,2,'') ,')') 
 From  cte A
)
Select NewStr = Stuff((Select '; '+TmpStr From cte2 order by TmpStr Desc For XML Path ('')),1,2,'')

Returns

NewStr
3 Outside Hire(Hire #01, Hire #03, Kara Emma); 2 Reassignment - External(Hire #15, Hire #21); 1 Internal Reassignment(John Pen)