Sql server 从XML SQL Select语句中获取值

Sql server 从XML SQL Select语句中获取值,sql-server,openxml,Sql Server,Openxml,我正在努力理解和学习如何从XML中获取价值。我从下面的链接中引用了一个XML文档 为了得到澄清,我删除了一些不需要的xml部分 范例 <?Label VCAT|RESERVATION|21405|SUCCESS?> <Reservation xmlns="reservation.fidelio.4.0" mfShareAction="NA" mfReservationAction="EDIT"> <reservationID>11650</

我正在努力理解和学习如何从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>
我也尝试过使用下面提到的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       |
+---------------+-------------------+---------+

尝试使用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)
DECLARE@xmldataxml
SET@XMLData=
11650

这是在SQL Server中读取XML的一种非常古老的方法。至少从SQL Server 2008(可能是2005年或更早)起就受到支持。@Larnu好的,那么根据我提供的示例,使用XQuery以哪种方式创建SQL查询呢?因此,对于上述内容,您希望获得什么样的输出?您能在您的问题中显示出来吗?@Larnu根据您的要求,我已经添加了我的输出,并对我的问题进行了一点修改。谢谢您的回答。我补充了一个问题。基于此,我是否能够在查询中以另一个节点(如reservationID)为目标?不仅是一个节点,而且是多个节点,都位于访客区之外?XT(XC)是什么意思?我们可以给出别名吗?@user1413:当然可以-更新我的响应以显示这一点。@user1413:XQuery中的
.nodes()
调用返回一个“虚拟”表,其中与XPath表达式匹配的每个XML节点都有一个条目。在SQL Server中,必须为“虚拟”表及其内的单个列指定别名。我通常选择
XT
作为“XML表
”,选择
XC`作为XML列-但您可以随意命名-您只需提供一些内容(然后可以使用这些内容获取
.value()
调用中的值)谢谢您的解释。
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)