带有默认命名空间的SQL Server XQuery

rea*_*ers 6 xml t-sql sql-server xquery

我在XML列的SQL Server表中有一些XML数据,如下所示:

<AffordabilityResults>
      <matchlevel xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">IndividualMatch</matchlevel>
      <searchdate xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">2013-07-29T11:20:53</searchdate>
      <searchid xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">{E40603B5-B59C-4A6A-92AB-98DE83DB46E7}</searchid>
      <calculatedgrossannual xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">13503</calculatedgrossannual>
  <debtstress xmlns="urn:callcredit.co.uk/soap:affordabilityapi2">
    <incomedebtratio>
      <totpaynetincome>0.02</totpaynetincome>
      <totamtunsecured>0.53</totamtunsecured>
      <totamtincsec>0.53</totamtincsec>
    </incomedebtratio>
  </debtstress>
</AffordabilityResults>
Run Code Online (Sandbox Code Playgroud)

你会注意到一些元素有一个xmlns属性,有些则不...

我需要编写查询来返回数据 - 更重要的是向业务分析师展示如何编写自己的查询以获取所需的数据,以便我希望它尽可能简单.

我可以使用WITH XMLNAMESPACES元素轻松查询数据,如下所示:

WITH XMLNAMESPACES (N'urn:callcredit.co.uk/soap:affordabilityapi2' as x )
SELECT

    ResponseXDoc.value('(/AffordabilityResults/x:matchlevel)[1]','varchar(max)' ) AS MatchLevel
  , ResponseXDoc.value('(/AffordabilityResults/x:debtstress/x:incomedebtratio/x:totamtunsecured)[1]','nvarchar(max)' ) AS UnsecuredDebt

  FROM [NewBusiness].[dbo].[t_TacResults]
Run Code Online (Sandbox Code Playgroud)

但是将x:part添加到查询中会使它看起来过于复杂,我想让业务分析师保持简单.

我尝试添加:

WITH XMLNAMESPACES (DEFAULT 'urn:callcredit.co.uk/soap:affordabilityapi2' )
Run Code Online (Sandbox Code Playgroud)

并从XQuery中删除x: - 但这会返回null(可能是因为根元素上缺少xmlns?)

有没有办法可以使用或不使用默认命名空间来简化这些查询?

Jen*_*rat 18

如果命名空间在您的用例中不重要,您可以使用命名空间通配符选择器*:,它选择没有和具有任意命名空间的节点.

一个示例查询可能是

(/*:AffordabilityResults/*:matchlevel)[1]
Run Code Online (Sandbox Code Playgroud)

业务分析师仍然必须在每个节点测试前添加选择器,但它始终是相同的"前缀",唯一的错误是忘记在某处使用它.