首页 > 解决方案 > 从 XML SQL Select 语句中获取值

问题描述

我正在尝试理解和学习如何从 XML 中获取价值。我从下面的链接中引用了一个 XML 文档。

关联

为了得到澄清,我删除了一些不需要的 xml 部分。

例子

 <?Label VCAT|RESERVATION|21405|SUCCESS?> 
<Reservation xmlns="reservation.fidelio.4.0" mfShareAction="NA" mfReservationAction="EDIT">
    <reservationID>11650</reservationID>
        <GuestCounts>
            <GuestCount>
                <ageQualifyingCode>ADULT</ageQualifyingCode> 
                <mfCount>1</mfCount> 
            </GuestCount>
            <GuestCount>
                <ageQualifyingCode>CHILD</ageQualifyingCode> 
                <mfCount>0</mfCount> 
            </GuestCount>
        </GuestCounts>
</Reservation>

在 HTML 中,例如 google.com - 我们使用 XPath 作为该页面的目标输入//input[@name='q']。同样,为了定位一个节点,我们可以指定//ageQualifyingCode在该节点内获取值。因此,基于此,我创建了一个下面指定的查询。谁能告诉我这个查询有什么问题,因为我得到的输出为 NULL。

   DECLARE @XmlDocumentHandle int 
DECLARE @XMLData XML
SET @XMLData ='<?Label VCAT|RESERVATION|21405|SUCCESS?> 
<Reservation xmlns="reservation.fidelio.4.0" mfShareAction="NA" mfReservationAction="EDIT">
    <reservationID>11650</reservationID>
        <GuestCounts>
            <GuestCount>
                <ageQualifyingCode>ADULT</ageQualifyingCode> 
                <mfCount>1</mfCount> 
            </GuestCount>
            <GuestCount>
                <ageQualifyingCode>CHILD</ageQualifyingCode> 
                <mfCount>0</mfCount> 
            </GuestCount>
        </GuestCounts>
</Reservation>'
EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XMLData  

SELECT *  
FROM OPENXML (@XmlDocumentHandle, '/Reservation/GuestCounts/GuestCount/',2)  
WITH (ageQualifyingCode     varchar(10)   '//ageQualifyingCode',  
      mfCount  int '//mfCount')  
EXEC sp_xml_removedocument @XmlDocumentHandle  

我也尝试过使用下面提到的 XQuery,但没有结果

SELECT * FROM (
SELECT TOP 1  
X.Y.value('(ageQualifyingCode)[1]', 'nvarchar(50)') AS ageQualifyingCode, X.Y.value('(mfCount)[1]', 'int') AS mfCount
FROM #temp1 t
CROSS APPLY t.xmlBody.nodes('Reservation/GuestCounts/GuestCount') AS X(Y)
) T

另外,我如何能够在同一个交叉应用中定位reservationID?

输出

+---------------+-------------------+---------+
| reservationID | ageQualifyingCode | mfCount |
+---------------+-------------------+---------+
| 11650         | ADULT             | 1       |
+---------------+-------------------+---------+
| 11650         | CHILD             | 0       |
+---------------+-------------------+---------+

标签: sql-serveropenxml

解决方案


尝试使用 XQuery 方法 - 定义 XML 命名空间,然后查询到 XML:

DECLARE @XMLData XML
SET @XMLData ='<?Label VCAT|RESERVATION|21405|SUCCESS?> 
<Reservation xmlns="reservation.fidelio.4.0" mfShareAction="NA" mfReservationAction="EDIT">
    <reservationID>11650</reservationID>
    <HotelReference>
        <GuestCounts>
            <GuestCount>
                <ageQualifyingCode>ADULT</ageQualifyingCode> 
                <mfCount>1</mfCount> 
            </GuestCount>
            <GuestCount>
                <ageQualifyingCode>CHILD</ageQualifyingCode> 
                <mfCount>0</mfCount> 
            </GuestCount>
        </GuestCounts>
    </HotelReference>
</Reservation>';

WITH XMLNAMESPACES(DEFAULT 'reservation.fidelio.4.0')
SELECT
    ReservationId = @XmlData.value('(/Reservation/reservationID)[1]', 'int'),
    AgeQualifyingCode = xc.value('(ageQualifyingCode)[1]', 'varchar(20)'),
    MfCount = xc.value('(mfCount)[1]', 'int')
FROM
    @XMLData.nodes('/Reservation/HotelReference/GuestCounts/GuestCount') AS XT(XC)

<ageQualifyingCode>这将返回具有和值的两行<mfCount>

在此处输入图像描述


推荐阅读