SQL Server 使用 xquery 进行 XML 查询

标签 sql sql-server xml xquery

我正在尝试在 sql server 上使用 xquery 获取下面的“行”数据。

DECLARE @xmlData XML
SET @xmlData = '
<Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <Header>
    <WorkContext xmlns="http://oracle.com/weblogic/soap/workarea/">rO0ABXdbABh3ZWJsb2duNDAAAA==</WorkContext>
  </Header>
  <Body>
    <getReport xmlns:ns0="http://report_xml.org">
      <return>
        <pagekey>F1D96FB7ACFBA3BD5D5E77C5</pagekey>
        <rapor>
          <dataSet xmlns="http://report_xml.org/dataSet/201006">
            <dataTable>
              <id>ABC1</id>
              <row>
                <dim1>Paris</dim1>
                <dim2>Societe</dim2>
                <dim3>Car</dim3>
              </row>
              <row>
                <dim1>Paris</dim1>
                <dim2>Credit</dim2>
                <dim3>Car</dim3>
              </row>
            </dataTable>
          </dataSet>
        </rapor>
      </return>
    </getReport>
  </Body>
</Envelope>
'

当我使用下面的代码时,我可以获得“pagekey”值

; WITH XMLNAMESPACES ('http://report_xml.org/dataSet/201006' AS DS)
select @xmlData.query('/Envelope/Body/getReport/return/pagekey')

或者我可以使用这个访问“dataSet”xml

; WITH XMLNAMESPACES ('http://report_xml.org/dataSet/201006' AS DS)
select @xmlData.query('/Envelope/Body/getReport/return/rapor/DS:dataSet')

但是,当我尝试进一步向下时

; WITH XMLNAMESPACES ('http://report_xml.org/dataSet/201006' AS DS)
select @xmlData.query('/Envelope/Body/getReport/return/rapor/DS:dataSet/dataTable/id')
or
select @xmlData.query('/Envelope/Body/getReport/return/rapor/DS:dataSet/dataTable/row')

查询返回空。

我错过了什么?

最佳答案

dataSet 元素引入默认命名空间 http://report_xml.org/dataSet/201006。请注意,与前缀命名空间不同,后代元素隐式继承祖先的默认命名空间,因此您应该使用相同的前缀来访问中的元素数据集:

; WITH XMLNAMESPACES ('http://report_xml.org/dataSet/201006' AS DS)
select @xmlData.query('/Envelope/Body/getReport/return/rapor/DS:dataSet/DS:dataTable/DS:id')
or
select @xmlData.query('/Envelope/Body/getReport/return/rapor/DS:dataSet/DS:dataTable/DS:row')

关于SQL Server 使用 xquery 进行 XML 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66452242/

相关文章:

mysql - 用户定义的变量不适用于 where 子句

sql-server - SQL Server 重复删除

sql - 在 SSIS OLE DB 源组件中使用参数执行存储过程

xml - XSD 中的 Ref 属性或 Type 属性

xml - 创建字符串的动态列表/数组-基于XML输入的整数对

sql - 如何传递 ERROR : more than one row returned by a subquery used as an expression

sql - 联合两个选择基于某些列(而不是整行)删除重复项

mysql - 通过 Rails 将 SQL 文件或 Excel 文件中的数据导入数据库

c# - SqlConnection、连接池和工作单元的设计模式

java - 对话框中的Viewpager?