create proc spSampleParser
@strInput VARCHAR(200)
as
-- format as XML
declare @oXML XML
select @oXML = CAST(('<I><O1>' + REPLACE(REPLACE(@strInput, ',', '</O2></I><I><O1>'),':','</O1><O2>') + '</O2></I>') AS XML)
-- select output1, output2
declare @Output1 varchar(200), @Output2 varchar(200)
select @Output1 = ISNULL((SELECT DISTINCT o1node.value('.', 'varchar(200)') + ',' FROM @oXML.nodes('/I/O1') AS oXML(o1node) FOR XML PATH('')), ''),
@Output2 = ISNULL((SELECT DISTINCT o2node.value('.', 'varchar(200)') + ',' FROM @oXML.nodes('/I/O2') AS oXML(o2node) FOR XML PATH('')), '')
-- remove trailing comma
select Output1 = SUBSTRING(@Output1, 1, LEN(@Output1) - 1), Output2 = SUBSTRING(@Output2, 1, LEN(@Output2) - 1)
return
declare @table table(Input varchar(200))
insert @table values ('-1:Insured'),('2:Insured,281:Insured'),('2:Insured'),('281:Insured'),('136:HMO,365:HMO,136:PPO,365:UNINSURED'),
('365:HMO,136:PPO,365:UNINSURED')
;with CTE AS (
select Input,ltrim(SUBSTRING(Input, n, CHARINDEX(',', Input + ',',n) - n)) Parsed_Input
from @table
cross join (SELECT number FROM master..spt_values WHERE type = 'P') AS Numbers(n)
WHERE SUBSTRING(',' + Input, n, 1) = ','
AND n < LEN(Input) + 1),
CTE2 AS (
select *,left(Parsed_Input,charindex(':',Parsed_Input)-1) left_part,
'"'+substring(Parsed_Input,charindex(':',Parsed_Input)+1,len(Parsed_Input))+'"' right_part
from CTE)
SELECT distinct Input,
STUFF(( SELECT DISTINCT ','+CONVERT(VARCHAR,left_part)
FROM CTE2 AS t2 WHERE t1.Input = t2.Input
FOR XML PATH('')), 1, 1, '') Output1,
STUFF(( SELECT DISTINCT ','+CONVERT(VARCHAR,right_part)
FROM CTE2 AS t2 WHERE t1.Input = t2.Input
FOR XML PATH('')), 1, 1, '') Output2
from CTE2 t1
/*
Input Output1 Output2
-1:Insured -1 "Insured"
136:HMO,365:HMO,136:PPO,365:UNINSURED 136,365 "HMO","PPO","UNINSURED"
2:Insured 2 "Insured"
2:Insured,281:Insured 2,281 "Insured"
281:Insured 281 "Insured"
365:HMO,136:PPO,365:UNINSURED 136,365 "HMO","PPO","UNINSURED"
*/
Open in new window