【问题标题】:T-SQL Shred Second Level XML Nodes into Multiple RowsT-SQL 将二级 XML 节点分解为多行
【发布时间】:2017-04-13 10:49:40
【问题描述】:

我觉得这应该是很简单的事情,但我似乎无法弄清楚。

给定以下 XML:

<Responses>
  <Response>
    <ResponseId>1</ResponseId>
    <DateCreated>2016-02-01T18:26:17Z</DateCreated>
    <Detail>
      ...
    </Detail>
  </Response>
  <Response>
    <ResponseId>2</ResponseId>
    <DateCreated>2016-02-01T18:33:28Z</DateCreated>
    <Detail>
      ...
    </Detail>
  </Response>
  <Response>
    <ResponseId>3</ResponseId>
    <DateCreated>2016-02-12T19:33:48Z</DateCreated>
    <Detail>
      ...
    </Detail>
  </Response>
  <Response>
    <ResponseId>4</ResponseId>
    <DateCreated>2016-02-15T18:21:09Z</DateCreated>
    <Detail>
      ...
    </Detail>
  </Response>
  <Response>
    <ResponseId>5</ResponseId>
    <DateCreated>2016-02-15T19:04:07Z</DateCreated>
    <Detail>
      ...
    </Detail>
  </Response>
</Responses>

我期待如下结果:

我能够很好地检索每个节点的元素(即 ResponseId、DateCreated 和 Detail 导致五行,每行 3 列),但我需要返回完整的响应节点 xml。

目前,我能想到的唯一解决方案是在检索 ResponseId、DateCreated 和 Detail 后手动重新构建所需的结果,但这对我来说似乎是一个混乱且容易出错的选项。

【问题讨论】:

    标签: sql-server xml


    【解决方案1】:

    您可以使用.nodes().query()

    DECLARE @xml XML=
    N'<Responses>
      <Response>
        <ResponseId>1</ResponseId>
        <DateCreated>2016-02-01T18:26:17Z</DateCreated>
        <Detail>
        </Detail>
      </Response>
      <Response>
        <ResponseId>2</ResponseId>
        <DateCreated>2016-02-01T18:33:28Z</DateCreated>
        <Detail>
        </Detail>
      </Response>
      <Response>
        <ResponseId>3</ResponseId>
        <DateCreated>2016-02-12T19:33:48Z</DateCreated>
        <Detail>
        </Detail>
      </Response>
      <Response>
        <ResponseId>4</ResponseId>
        <DateCreated>2016-02-15T18:21:09Z</DateCreated>
        <Detail>
        </Detail>
      </Response>
      <Response>
        <ResponseId>5</ResponseId>
        <DateCreated>2016-02-15T19:04:07Z</DateCreated>
        <Detail>
        </Detail>
      </Response>
    </Responses>';
    

    --选择

    SELECT One.Resp.query(N'.')
    FROM @xml.nodes(N'/Responses/Response') AS One(Resp)
    

    【讨论】:

    • 发布此问题后不久,我发现了另一个涉及相关查询的解决方案,但这所以更优雅!我对在 SQL 查询中使用 XML 比较陌生,所以我仍在学习 XQuery 语法。
    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    相关资源
    最近更新 更多