2013-12-19 151 views
1

我有4个包含各种数据的表。TSQL在存储过程中解析XML

表1包含问题 表2包含组 表3包含选项 表4包含有用于配置文件数据

简档数据被生成并转换为XML,并存储在profileData列上的列工作申请表4.它的格式是这样:

<proficiencies> 
<question> 
    <questionID>2</questionID> 
    <questionGroup>2</questionGroup> 
    <questionOptions> 
    <option>19</option> 
    <option>20</option> 
    <option>31</option> 
    </questionOptions> 
</question> 
<question> 
    <questionID>1</questionID> 
    <questionGroup>1</questionGroup> 
    <questionOptions> 
    <option>20</option> 
    <option>29</option> 
    <option>21</option> 
    </questionOptions> 
</question> 
<question> 
    <questionID>3</questionID> 
    <questionGroup>2</questionGroup> 
    <questionOptions> 
    <option>18</option> 
    <option>29</option> 
    </questionOptions> 
</question> 
</proficiencies> 

现在,我创建了一个网页,我需要重新创建与所有这些选择的设置工作申请。当我创建XML时,我使用的是与实际问题和信息相关的ID号码。

什么是能够找出这些身份证号码现在的最佳方式?我想在存储过程中最好这样做,因为如果我在javascript中解析它时,它会有很多数据库调用。

只是不知道如何最好地去解决这个问题或改变我的数据库结构。

在这个例子中,我需要找出问题是什么地方的问题ID = 2等

有没有更好的方式来做到这一点?

+0

,你能否告诉我们您使用格式化为XML之前提取数据的查询? – Rikalous

+0

数据在列中以XML格式存储,我基于它们选择的所有选项ID在JavaScript中创建它。然后我将它作为一个xml块存储。现在我需要通过该XML块,并找出这些ID是 – SBB

+0

用于显示目的我将使用数据表/数据集。很少几行,你就完成了。 – KumarHarsh

回答

0

我认为你正在寻找XQuery

以下示例解析出您的XML并将其连接到问题表。它使用nodes(),query()value()方法。

with MyXML 
as 
(
select 
1 as MyXMLDataID 
,cast(' 
<proficiencies> 
<question> 
    <questionID>2</questionID> 
    <questionGroup>2</questionGroup> 
    <questionOptions> 
    <option>19</option> 
    <option>20</option> 
    <option>31</option> 
    </questionOptions> 
</question> 
<question> 
    <questionID>1</questionID> 
    <questionGroup>1</questionGroup> 
    <questionOptions> 
    <option>20</option> 
    <option>29</option> 
    <option>21</option> 
    </questionOptions> 
</question> 
<question> 
    <questionID>3</questionID> 
    <questionGroup>2</questionGroup> 
    <questionOptions> 
    <option>18</option> 
    <option>29</option> 
    </questionOptions> 
</question> 
</proficiencies>' as xml) as MyXMLData), 
MyQuestionGroups 
as 
(
select 1 as questionGroup, 'Education' as questionGroup_description 
union 
select 2 as questionGroup, 'Experience' as questionGroup_description 
), 
MyQuestions 
as 
(
select 1 as questionGroup, 1 as questionID, 'High school attendance' as question 
union 
select 2 as questionGroup, 2 as questionID, 'Alchemy experience' as question 
union 
select 2 as questionGroup, 3 as questionID, 'Arbitrage experience' as question 
), 
MyOptions 
as 
(
select 18 as optionID, '1 year' as option_description 
union 
select 19 as optionID, '2 year' as option_description 
union 
select 20 as optionID, '3 years' as option_description 
union 
select 21 as optionID, '4 year' as option_description 
union 
select 29 as optionID, '5 year' as option_description 
union 
select 31 as optionID, '6 years' as option_description 
) 
SELECT MyXML.MyXMLDataID 
     ,t1.questionID.query('.') as questionID_node 
     ,q.question 
    FROM MyXML 
CROSS APPLY MyXMLData.nodes('/proficiencies/question/questionID') as t1(questionID) 
INNER JOIN MyQuestions q 
     on q.questionID = t1.questionID.value('.', 'int') 

它返回这样的结果:

----------------------------------------------- 
MyXMLDataID questionID_node question 
----------------------------------------------- 
1 <questionID>2</questionID> Alchemy experience 
1 <questionID>1</questionID> High school attendance 
1 <questionID>3</questionID> Arbitrage experience