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入力に基づいて、2つの属性があります-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 に答える