I have XML data that is used to store quiz results. I need to convert this into two tables, one containing the questions, and the other containing the answers, but crucially, have a relation between them.
Currently this relation only exists in the XML structure (there are no ID values, etc.).
After a day of research and testing out different approaches, I've got as far as extracting the two parts, but cannot figure out how to create the hierarchy:
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);
Can anyone please enlighten me if it is possible to create IDs/GUID's (or something) to create the parent/child hierarchy that respects the XML file? I should add, in actual fact this is an XML column and the data will be transformed en-masse. I'm just using a variable until I figure out the basic approach.