【发布时间】:2018-02-03 15:00:39
【问题描述】:
我有用于存储测验结果的 XML 数据。我需要将其转换为两张表,一张包含问题,另一张包含答案,但至关重要的是,它们之间存在关系。
目前这种关系只存在于 XML 结构中(没有 ID 值等)。
经过一天的研究和测试不同的方法,我已经提取了这两个部分,但不知道如何创建层次结构:
declare @xml xml = N'<quizresult>
<question>
<questionText>Which fire extinguisher is most suitable for a waste paper basket fire?</questionText>
<answer number="0" value="0" chosen="0" imageURL="">Powder</answer>
<answer number="1" value="0" chosen="0" imageURL="">Carbon Dioxide (CO2)</answer>
<answer number="2" value="1" chosen="1" imageURL="">Water (H2O)</answer>
<answer number="3" value="0" chosen="0" imageURL="">Foam</answer>
<result>Correct</result>
</question>
<question>
<questionText>What should your immediate action be on hearing a fire alarm?</questionText>
<answer number="0" value="0" chosen="0" imageURL="">Find all of your colleagues before making a speedy exit together</answer>
<answer number="1" value="0" chosen="0" imageURL="">Collect all your valuables before making a speedy exit</answer>
<answer number="2" value="0" chosen="0" imageURL="">Check the weather to see if you need your coat before leaving</answer>
<answer number="3" value="1" chosen="1" imageURL="">Leave the building by the nearest exit, closing doors behind you if the rooms are empty</answer>
<result>Correct</result>
</question>
<question>
<questionText>Which is the most suitable extinguisher for a Computer which is on fire?</questionText>
<answer number="0" value="0" chosen="1" imageURL="">Water (H2O)</answer>
<answer number="1" value="0" chosen="0" imageURL="">Powder</answer>
<answer number="2" value="1" chosen="0" imageURL="">Carbon Dioxide (CO2)</answer>
<result>Incorrect</result>
</question>
</quizresult>';
-- Get questions only
DECLARE @questions TABLE (questionText nvarchar(max), result nvarchar(50));
INSERT INTO @questions (questionText, result)
SELECT
n.q.value('(./questionText)[1]', 'nvarchar(max)') AS questionText,
n.q.value('(./result)[1]', 'nvarchar(50)') AS result
FROM
@xml.nodes('/quizresult/question') AS n (q);
-- Get answers only
DECLARE @answers TABLE (answer nvarchar(max), number int, val int, chosen bit);
INSERT INTO @answers (answer, number, val, chosen)
SELECT
n.q.value('.[1]', 'nvarchar(max)') AS answer,
n.q.value('@number', 'int') AS number,
n.q.value('@value', 'int') AS val,
n.q.value('@chosen', 'bit') AS chosen
FROM
@xml.nodes('/quizresult/question/answer') AS n (q);
如果可以创建 ID/GUID(或其他东西)来创建尊重 XML 文件的父/子层次结构,谁能告诉我? 我应该补充一点,实际上这是一个 XML 列,数据将被整体转换。在弄清楚基本方法之前,我只是在使用一个变量。
【问题讨论】:
-
我认为唯一的可能性是使用答案文本加入问题和答案。但在这种情况下,问题必须是唯一的。
标签: sql-server tsql sql-server-2012 xquery sqlxml