【问题标题】:SQL Server 2005 with XML Namespaces - Query Multiple Nodes and Properties带有 XML 命名空间的 SQL Server 2005 - 查询多个节点和属性
【发布时间】:2012-07-25 08:49:49
【问题描述】:

我有以下 XML 和代码,可以拉回 AccountNumber 和 Status。我也需要撤退……

  • MFRRequest 的 ID 属性
  • CaseInformation 节点中的几个元素

我不确定如何获取 ID 属性,我想知道...我可以在同一个查询中获取所有这些信息(来自多个节点)吗?

谢谢!

DECLARE @doc xml
SET @doc =
'<?xml version="1.0" encoding="UTF-8"?>
<p:OrderRequest xmlns:p="http://XXX.Schemas.OrderRequest/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://XXX.Schemas.OrderRequest/2 OrderRequestV2.xsd ">
  <p:Header>
    <p:SCRARequestCount>0</p:SCRARequestCount>
    <p:MFRRequestCount>1</p:MFRRequestCount>
    <p:FileCreatedAt>2001-12-31T12:00:00</p:FileCreatedAt>
    <p:RequestFileName>p:RequestFileName</p:RequestFileName>
  </p:Header>
  <p:RequestItems>
  <p:MFRRequest id="1" priority="">
      <p:AccountNumber>9999999</p:AccountNumber>
      <Status>Initial</Status>
      <p:CaseInformation>
       <ReferralDate>2011-01-01</ReferralDate>
       <LoanType>1A</LoanType>
       <ARM>Yes</ARM>
        <InvestorNumber>InvestorNumber</InvestorNumber>
        <PropertyAddress>PropertyAddress</PropertyAddress>
        <PrivateLabel>Yes</PrivateLabel>
        <CaseNumber>01-11111/AK/</CaseNumber>
        <SuspenseBalance>9999.00</SuspenseBalance>
        <TitleOrderedDate>2011-09-01</TitleOrderedDate>
        <TotalMonthlyPayment>876.99</TotalMonthlyPayment>
      </p:CaseInformation>
    </p:MFRRequest>
  </p:RequestItems>
</p:OrderRequest>'
;WITH XMLNAMESPACES('http://XXX.Schemas.OrderRequest/2' AS p) 

SELECT     
 Y.i.value('Status[1]', 'varchar(10)') AS Status ,
 Y.i.value('p:AccountNumber[1]', 'varchar(10)') AS AccountNumber
FROM      @doc.nodes('/p:OrderRequest/p:RequestItems/p:MFRRequest') AS Y(i) 

【问题讨论】:

    标签: sql sql-server xml namespaces xml-namespaces


    【解决方案1】:

    试试这样的:

    ;WITH XMLNAMESPACES('http://XXX.Schemas.OrderRequest/2' AS p)
    SELECT 
        MFRRequestID = Y.i.value('(@id)[1]', 'int'),
        RequestStatus = Y.i.value('Status[1]', 'varchar(10)') ,
        AccountNumber = Y.i.value('p:AccountNumber[1]', 'varchar(10)'),
        ReferralDate = CIF.value('(ReferralDate)[1]', 'varchar(25)'),
        CaseInfoType = CIF.value('(Type)[1]', 'varchar(25)')
    FROM 
        @doc.nodes('/p:OrderRequest/p:RequestItems/p:MFRRequest') AS Y(i)
    CROSS APPLY
        i.nodes('p:CaseInformation') AS Tbl(CIF)
    

    基本上,一旦您的Y(i) 伪表中有&lt;p:MFRRequest&gt; XML 元素,您就可以再次调用.nodes() 来获取(可能是多个)&lt;p:CaseInfomration&gt; 节点并使用@987654326 @ 调用这个新的第二个伪表以从中提取单个信息。

    【讨论】:

    • 顺便说一句,如果你不想做所有那些“p:”前缀,你可以指定“with xmlnamespaces(default 'http://...')”
    猜你喜欢
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2016-06-09
    相关资源
    最近更新 更多