2013-12-19 2 views
1

У меня есть 4 таблицы, которые содержат различные фрагменты данных.TSQL Parse 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, я использую идентификационные номера, привязанные к актуальному вопросу и информации.

Каков наилучший способ узнать, что такое идентификационные номера? Я решил, что было бы лучше сделать это в хранимой процедуре, потому что, если бы я это сделал, анализируя его в javascript, у него было бы много запросов к базе данных.

Просто не уверен, как лучше всего это изменить или изменить структуру моей базы данных.

В примере, мне нужно, чтобы выяснить, что вопрос, где вопрос ID = 2 и т.д.

Есть ли лучший способ сделать это?

+0

Можете ли вы показать нам запрос, используемый для извлечения данных перед форматированием в XML? – Rikalous

+0

Данные хранятся как XML в столбце, я создаю его в javascript на основе всех выбранных идентификаторов параметров. Затем я просто сохранил его как блок xml. Теперь мне нужно пройти через этот XML-блок и узнать, что такое ID – SBB

+0

для отображения цели, я буду использовать datatable/dataset. Несколько строк, и все готово. – 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 
Смежные вопросы