declare @val varchar(8000) set @val = 'AA1,10.1;BB1,6.5' /************************拆分成多行多列start***************************/ --v1.0 SELECT rowSet.[1] AS 'MaterialId' ,rowSet.[2] AS 'Qty' ,rowSet.[3] AS 'StockId' ,rowSet.[4] AS 'dateTime' FROM ( SELECT CAST(''+ REPLACE(rowSet.resVal,',','') + '' AS XML) AS xmlVal ,ROW_NUMBER() over (order by resVal) RN FROM ( SELECT CAST(''+ REPLACE('AA1,10.1;BB1,16.5',';','') + '' AS XML) AS xmlVal ) AS valSet OUTER APPLY ( SELECT T.C.value('.','varchar(100)') resVal FROM valSet.xmlVal.nodes('/v') AS T(C) ) rowSet ) AS valSet OUTER APPLY ( SELECT TT2.* FROM ( SELECT T.C.value('.','varchar(100)') resVal ,ROW_NUMBER() over (order by valSet.RN) RowNo FROM valSet.xmlVal.nodes('/v') AS T(C) ) TT PIVOT ( MAX(TT.resVal) FOR TT.RowNo IN ([1],[2],[3],[4])) TT2 ) rowSet --v2.0 SELECT rowSet2.[1] AS 'MaterialId' ,rowSet2.[2] AS 'Qty' ,rowSet2.[3] AS 'StockId' ,rowSet2.[4] AS 'FDate' ,rowSet2.[5] AS 'FSBILLID' ,rowSet2.[6] AS 'FSID' ,rowSet2.[7] AS 'FSTABLENAME' ,0 AS 'HasVal' FROM ( SELECT 1 ID,CAST(''+ REPLACE('AA1,10.1;BB1,16.5',';','') + '' AS XML) AS xmlVal ) AS valSet OUTER APPLY ( SELECT ROW_NUMBER() OVER (ORDER BY valSet.ID) RN ,CAST(''+ REPLACE(T.C.value('.','varchar(100)'),',','') + '' AS XML) xmlVal FROM valSet.xmlVal.nodes('/v') AS T(C) ) rowSet OUTER APPLY ( SELECT * FROM ( SELECT T.C.value('.','varchar(100)') AS xmlVal ,ROW_NUMBER() OVER (ORDER BY rowSet.RN) RowNo FROM rowSet.xmlVal.nodes('/v') AS T(C) ) TT PIVOT ( MAX(TT.xmlVal) FOR TT.RowNo IN ([1],[2],[3],[4],[5],[6],[7])) TT2 ) rowSet2 /************************拆分成多行多列end***************************/ /************************拆分成多行start***************************/ SELECT rowSet.resVal ,rowSet.rowNo FROM ( SELECT CAST(''+ REPLACE('AA1,10.1;BB1,6.5',';','') + '' AS XML) AS xmlVal ) AS valSet OUTER APPLY ( SELECT T.C.value('.','varchar(100)') resVal ,row_number() over (order by C) rowNo FROM valSet.xmlVal.nodes('/v') AS T(C) ) rowSet /************************拆分成多行end***************************/