我正在尝试将以下XML转换为表。
DECLARE @XMLToParse XML;
SET @XMLToParse = '<Employees>
<Senior>
<Emp>
Ravi
</Emp>
<Emp>
Shanker
</Emp>
<Emp>
Aditya
</Emp>
</Senior>
<Junior>
<Emp>
Roy
</Emp>
<Emp>
Sham
</Emp>
<Emp>
Divya
</Emp>
</Junior>
</Employees>';
DECLARE @ParsingTable TABLE
(Senior VARCHAR(100),Junior VARCHAR(100))
INSERT
INTO @ParsingTable
(Senior)
SELECT xmlData.A.value('.', 'VARCHAR(100)') AS Senior
FROM @XMLToParse.nodes('Employees/Senior/Emp') as xmlData(A)
select * from @ParsingTable
我正在尝试创建表,如下所示:
Senior Junior
-----------------
Ravi Roy
Shanker Sham
Aditya Divya
上面的代码给了我第一列,但是我不知道如何插入第二列。
最佳答案
我敢肯定有很多方法可以通过使用cross apply
来获得您想要的结果之一
方法1
DECLARE @ParsingTable TABLE
(Senior VARCHAR(100),Junior VARCHAR(100))
INSERT
INTO @ParsingTable
(Senior,Junior)
SELECT A.value('.', 'VARCHAR(100)') AS Senior,
B.value('.', 'VARCHAR(100)') AS Junior
FROM @XMLToParse.nodes('Employees/Senior/Emp') as xmlDataSenior(A) CROSS APPLY
@XMLToParse.nodes('Employees/Junior/Emp') as xmlDataJunior(B)
注意:这将为您提供重复的记录
方法2:
通过这种方法,您只能获得一个记录...对于第一条记录
[1]
,对于第二条记录[2]
,第三条记录[3]
依此类推.......SELECT
@XMLToParse.value('(Employees/Senior/Emp/text())[1]','VARCHAR(100)') AS Senior,
@XMLToParse.value('(Employees/Senior/Emp/text())[1]','VARCHAR(100)') AS Junior
方法3:通过此技巧,您可以获得所需的结果
使用
Row_Number
使2个Common Table Expression分别用于Senior和Junior,并通过第一个CTE的row_number与第二个CTE联接这两个cte
这是您的完整代码
DECLARE @XMLToParse XML;
SET @XMLToParse = '<Employees>
<Senior>
<Emp>
Ravi
</Emp>
<Emp>
Shanker
</Emp>
<Emp>
Aditya
</Emp>
</Senior>
<Junior>
<Emp>
Roy
</Emp>
<Emp>
Sham
</Emp>
<Emp>
Divya
</Emp>
</Junior>
</Employees>';
DECLARE @ParsingTable TABLE
(Senior VARCHAR(1000),Junior VARCHAR(100))
;with cte as
(
SELECT A.value('.', 'VARCHAR(100)') AS Senior,
ROW_NUMBER() OVER(ORDER BY A.value('.', 'VARCHAR(100)') DESC) AS SeniorRowNo
FROM @XMLToParse.nodes('Employees/Senior/Emp') as xmlDataSenior(A)
)
, cte2 as
(
SELECT B.value('.', 'VARCHAR(100)') AS Junior,
ROW_NUMBER() OVER(ORDER BY B.value('.', 'VARCHAR(1000)') DESC) AS JuniorRowNo
FROM
@XMLToParse.nodes('Employees/Junior/Emp') as xmlDataJunior(B)
)
INSERT INTO @ParsingTable(Senior,Junior)
Select cte.Senior,cte2.Junior
From cte inner join cte2 on cte.SeniorRowNo= cte2.JuniorRowNo
select * from @ParsingTable
SQLFIDDLE METHOD 3
输出:
Senior Junior
-----------------
Shanker Sham
Ravi Roy
Aditya Divya
关于sql - 在SQL中将简单的XML转换为表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30015944/