22,209
社区成员
发帖
与我相关
我的任务
分享
DECLARE @s VARCHAR(1000)
SET @s='1,2,3,4,(5,6),7,(8,(9,10))'
DECLARE @x XML
SELECT @x= '<r>' + REPLACE(@s,',','</r><r>') + '</r>'
SELECT v = x.value('.','VARCHAR(100)'),id=ROW_NUMBER() OVER(ORDER BY GETDATE()) INTO #1 FROM @x.nodes('//r') AS t(x)
SELECT a.v v1,a.id id1,b.v v2,b.id id2
INTO #2
FROM #1 a
CROSS APPLY
(
SELECT TOP 1 * FROM #1 x
WHERE x.id>=a.id
AND
((
(SELECT SUM( LEN(REPLACE(c.v,')',''))-LEN(REPLACE(c.v,'(',''))) FROM #1 c WHERE c.id<=a.id)
=
LEN(x.v) - LEN(REPLACE(x.v,')','')) -
ISNULL((
SELECT SUM(LEN(d.v)-LEN(REPLACE(d.v,'(','')) ) FROM #1 d WHERE d.id>a.id AND d.id<=x.id
),0)
)
or (SELECT SUM( LEN(REPLACE(e.v,')',''))-LEN(REPLACE(e.v,'(',''))) FROM #1 e WHERE e.id<=a.id)=0
)
ORDER BY x.id
) b
ORDER BY a.id
SELECT MIN(id1) ids,MAX(id2) ide,id2 gid,IDENTITY(INT) NID INTO #3 FROM #2 GROUP BY id2
SELECT NID as gid,v=STUFF(v.value('/R[1]','nvarchar(max)'),1,1,'') FROM #3 a
CROSS APPLY
(
SELECT v=(SELECT N','+ v FROM #1 WHERE id BETWEEN ids AND ide FOR XML PATH(''), ROOT('R'), TYPE)
) b
/*
1 1
2 2
3 3
4 4
5 (5,6)
6 7
7 (8,(9,10))
*/
DROP TABLE #1,#2,#3