2

openXML第一次尝试在 SQL Server 2012 中使用该功能,但遇到了问题。如果我有一个没有价值的节点,即

<amenity id="bathtub" name="Bathtub" />

使用下面的代码从 XML 中提取数据时,我总是得到一个返回的 NULL 值。任何正常元素,即

<name>Attic Loft in a historical building</name>

似乎工作正常。有没有一种简单的方法可以使用 openXML 检查节点是否存在?

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)

SELECT @XML = XMLData FROM myXML

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT *
FROM OPENXML(@hDoc, 'properties/property/amenities')
WITH 
(
name [nvarchar](250) '../name',
externalId [nvarchar](50) '../id',
externalURL [nvarchar](250) '../landing_page_url',
description [nvarchar](max) '../description',
bathtub [bit] 'bathtub '
)

EXEC sp_xml_removedocument @hDoc
GO
4

1 回答 1

4

我会使用对 SQL Server的内置、本机 XQuery 支持OpenXML——旧的、笨重的、内存泄漏等等......

您可以使用指示符通过 XPath 表达式访问属性- 如下所示:@

DECLARE @input XML = '<amenity id="bathtub" name="Bathtub" />'

SELECT
    ID = @input.value('(/amenity/@id)[1]', 'varchar(50)'),
    Name = @input.value('(/amenity/@name)[1]', 'varchar(50)')

根据您的 XML 输入,您有两个属性 -id并且(在您的 OpenXML 示例中似乎name没有任何调用......)bathtub

<amenity id="bathtub" name="Bathtub" />
         ^^           ^^^^
         *            * 
         *            * --> attribute is called "name"
         *
         *--> attribute is called "id" (not "bathtub" - that's it's *value*, not the name!)

有关 SQL Server 2005 中 XQuery 支持的更多信息 - 请阅读这些文章:

更新:如果您想遍历 XML 元素列表,请使用.nodes()带有 XPath 表达式的函数来获取 XML 片段列表,然后您可以从中获取各个位 - 如下所示:

DECLARE @input XML = '<properties><property><amenity id="bathtub" name="Bathtub" /></property><property><amenity id="pool" name="Big honking pool" /></property></properties>'

SELECT
    ID = XCol.value('(amenity/@id)[1]', 'varchar(50)'),
    Name = XCol.value('(amenity/@name)[1]', 'varchar(50)')
FROM
    @input.nodes('/properties/property') AS XTbl(XCol)
于 2013-11-04T13:52:17.250 回答