2013-12-19 145 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