T-SQL XQuery嵌套名称空间问题

时间:2019-06-11 16:42:18

标签: sql-server tsql namespaces xquery

我只想要一个实际的EndTime-这么多问吗?

#

this之类的帖子中看来,我应该能够执行以下查询:

declare @x xml = '
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <bogus>1934</bogus>
    <getJobActionsResponse xmlns="urn:JobService">
      <getJobActionsReturn>
        <job xmlns:ns1="urn:JobService" xsi:type="ns1:SvcJob">
          <actions />
          <actualEndTime>
            <dateString>2019-05-15 19:46:54.207</dateString>
          </actualEndTime>
        </job>
      </getJobActionsReturn>
    </getJobActionsResponse>
  </soapenv:Body>
</soapenv:Envelope>'

我尝试了各种名称空间前缀的排列,但是我尝试的所有操作都返回null。我什至无法获得上游虚假值来返回非null:

;with xmlnamespaces (N'http://schemas.xmlsoap.org/soap/envelope/' as ns0, 
                     N'urn:JobService' as ns2)
select @x.value('(/ns0:envelope/ns0:body/ns2:getJobActions/ns2:getJobActionsReturn/ns2:job/ns2:actualEndTime)[1]', 'nvarchar(max)')

我没有名称空间(每个解释它们的网页似乎都长一英里)。抱歉,请谢谢。

1 个答案:

答案 0 :(得分:3)

您很亲密,但是您有以下错误:

  • 标记名称是区分大小写的-您需要使用<ns0:Envelope>(而非<ns0:envelope>)等。

  • 您将<ns2:getJobActionsResponse>拼错为<ns2:getJobActions>

  • 您并没有“一路走到” <ns2:dateString>元素

尝试一下:

declare @x xml = '
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soapenv:Body>
    <bogus>1934</bogus>
    <getJobActionsResponse xmlns="urn:JobService">
      <getJobActionsReturn>
        <job xmlns:ns1="urn:JobService" xsi:type="ns1:SvcJob">
          <actions />
          <actualEndTime>
            <dateString>2019-05-15 19:46:54.207</dateString>
          </actualEndTime>
        </job>
      </getJobActionsReturn>
    </getJobActionsResponse>
  </soapenv:Body>
</soapenv:Envelope>'

;with xmlnamespaces (N'http://schemas.xmlsoap.org/soap/envelope/' as ns0, 
                     N'urn:JobService' as ns2)
select @x.value('(/ns0:Envelope/ns0:Body/ns2:getJobActionsResponse/ns2:getJobActionsReturn/ns2:job/ns2:actualEndTime/ns2:dateString)[1]', 'nvarchar(max)')