【问题标题】:TSQL Parse XML in Stored ProcedureTSQL 在存储过程中解析 XML
【发布时间】:2013-12-19 01:13:53
【问题描述】:

我有 4 个表,其中包含各种数据。

表 1 包含问题 表 2 包含组 表 3 包含选项 表 4 包含带有 Profile Data 列的工作申请

profile 数据生成并转换为 XML 并存储在表 4 的 profileData 列中。其格式如下:

<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 号。

现在找出这些 ID 号的最佳方法是什么?我认为最好在存储过程中执行此操作,因为如果我在 javascript 中解析它时这样做,它将有很多数据库调用。

只是不确定如何最好地解决这个问题或更改我的数据库结构。

在示例中,我需要找出问题 ID = 2 等的问题。

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

【问题讨论】:

  • 您能告诉我们您在将数据格式化为 xml 之前用于提取数据的查询吗?
  • 数据作为 XML 存储在列中,我根据他们选择的所有选项 ID 在 javascript 中创建它。然后我将它存储为一个 xml 块。现在我需要遍历那个 XML 块并找出这些 ID 是什么
  • 为了显示目的,我将使用数据表/数据集。很少行,你就完成了。

标签: sql sql-server xml tsql


【解决方案1】:

我想你正在寻找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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多