【问题标题】:Query to retrieve value from XML In SQL查询以从 SQL 中的 XML 检索值
【发布时间】:2017-08-16 01:17:09
【问题描述】:

我的 SQL 表中有以下 XML:

<SiteSurveyData>
  <SurveyQuestionAnswers>
    <QuestionGUID>61</QuestionGUID>
    <Answer>XXXXXXX</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>62</QuestionGUID>
    <Answer>XXX</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>64</QuestionGUID>
    <Answer>Both</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>63</QuestionGUID>
    <Answer>aal5snap</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>81</QuestionGUID>
    <Answer>00</Answer>
  </SurveyQuestionAnswers>

我想要查询的是 /Answer 中 /QuestionGUID = 61 和 62 的值。

我试过用这个:

value('(/SiteSurveyData/SurveyQuestionAnswers/QuestionGUID)[1]'

但它只返回第一个 QuestionGUID。
如何编写查询以返回 QuestionGUID 61 和 62 的答案?

或者我只想得到 QuestionGuid = 61 的 /Answer。
它并不总是第一个元素,是否可以编写查询使其返回 QuestionGuid=61 的值?

【问题讨论】:

标签: sql-server xml


【解决方案1】:
DECLARE @t TABLE(id INT IDENTITY(1,1),x XML);
INSERT INTO @t(x)VALUES('<SiteSurveyData>
  <SurveyQuestionAnswers>
    <QuestionGUID>61</QuestionGUID>
    <Answer>XXXXXXX</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>62</QuestionGUID>
    <Answer>XXX</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>64</QuestionGUID>
    <Answer>Both</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>63</QuestionGUID>
    <Answer>aal5snap</Answer>
  </SurveyQuestionAnswers>
  <SurveyQuestionAnswers>
    <QuestionGUID>81</QuestionGUID>
    <Answer>00</Answer>
  </SurveyQuestionAnswers></SiteSurveyData>');

SELECT
    n.v.value('./QuestionGUID[1]','NVARCHAR(256)') AS QuestionGUID,
    n.v.value('./Answer[1]','NVARCHAR(256)') AS Answer
FROM
    @t AS t
    CROSS APPLY t.x.nodes('SiteSurveyData/SurveyQuestionAnswers[QuestionGUID="61" or QuestionGUID="62"]') AS n(v)

结果就是您想要的(两行以XXXXXXXXXX 作为答案)。这将应用一个 XPath 表达式来查找 SurveyQuestionAnswers 以及 61 或 62 的 QuestionGUID 子代。

【讨论】:

  • n 是从哪里来的? n.v.值?
  • @user2665372 与返回节点的函数交叉应用时,需要分配表别名和列别名。那是节点函数之后的AS n(v)n 是表别名,v 是列别名。然后,由于v 列是一个节点,您需要使用value 函数从中提取一个值。所以n.v.value(...) 将值函数应用于n.v 列中的节点。
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
相关资源
最近更新 更多