从 XML SQL Select 语句中获取值
Get the value from the XML SQL Select Statement
我正在努力理解和学习如何从 XML 中获取价值。我从下面的 link 中引用了一份 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 |
+---------------+-------------------+---------+
尝试使用 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)
这将 return 具有 <ageQualifyingCode>
和 <mfCount>
值的两行:
我正在努力理解和学习如何从 XML 中获取价值。我从下面的 link 中引用了一份 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 |
+---------------+-------------------+---------+
尝试使用 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)
这将 return 具有 <ageQualifyingCode>
和 <mfCount>
值的两行: