if OBJECT_ID('tempdb..#temp', 'u') is not null   drop table #temp;
create table #temp([msg] varchar(max));
insert #temp
SELECT 'CIN000291:10,CIN000292:30,CIN000296:20'WITH a1 AS
(
SELECT b.*
FROM
(SELECT msg=CONVERT(XML, '<root><v>'+replace(RTRIM(LTRIM(msg)),',','</v><v>')+'</v></root>') FROM #temp) a
OUTER APPLY
(SELECT msg = C.v.value('.','NVARCHAR(MAX)') FROM a.msg.nodes('/root/v') C(v)) b
)
,a2 AS
(
SELECT b.*,ROW_NUMBER() OVER(ORDER BY @@servername)%2 re
FROM
(SELECT msg=CONVERT(XML, '<root><v>'+replace(RTRIM(LTRIM(msg)),':','</v><v>')+'</v></root>') FROM a1) a
OUTER APPLY
(SELECT msg = C.v.value('.','NVARCHAR(MAX)') FROM a.msg.nodes('/root/v') C(v)) b
)
select msg=STUFF((SELECT ' '+msg FROM a2 WHERE re=0 FOR XML PATH('')),1,1,'')

解决方案 »

  1.   


      SELECT  *
      FROM dbo.[Split]('CIN000291:10,CIN000292:30,CIN000296:20',',') s
      OUTER APPLY(
    SELECT * FROM dbo.[Split](s.[Value],':') s2 WHERE s2.Id=2
      ) r1
    --result-------------Id Value Id Value
    1 CIN000291:10 2 10
    2 CIN000292:30 2 30
    3 CIN000296:20 2 20
      

  2.   

    create table #tb (col varchar(8000))insert into #tb 
    select 'CIN000291:10,CIN000292:30,CIN000296:20'
    select * from #tb ;with cte as 
    (select a.col ,b.number,str=SUBSTRING (a.col ,b.number ,CHARINDEX (',',a.col+',' ,b.number )-b.number)  from #tb  a join master .dbo.spt_values b  on b.number <len(a.col) 
    where b.type ='P' and substring (','+a.col ,b.number,1)=',' )select *,SUBSTRING (str,CHARINDEX (':',str,1)+1,LEN(str)) from cte drop table #tb