XML ドキュメント内のメタプロパティ属性は、要素、属性、その他の DOM ノードなど、XML 項目のプロパティを記述する属性です。 これらの属性は、XML ドキュメント テキストに物理的に存在しません。 ただし、OPENXML は、すべての XML 項目に対してこれらのメタプロパティを提供します。 これらのメタプロパティを使用すると、XML ノードのローカル配置や名前空間情報などの情報を抽出できます。 この情報は、テキスト表現で明らかである以上の詳細を提供します。
これらのメタプロパティは、 ColPattern パラメーターを使用して OPENXML ステートメントの行セット列にマップできます。 列には、マップ先のメタプロパティの値が含まれます。 OPENXML の構文の詳細については、 OPENXML (Transact-SQL) を参照してください。
メタプロパティ属性にアクセスするために、SQL Server に固有の名前空間が提供されます。 この名前空間 urn:schemas-microsoft-com:xml-metaprop を使用すると、ユーザーはメタプロパティ属性にアクセスできます。 OPENXML クエリの結果がエッジ テーブル形式で返される場合、エッジ テーブルには、 xmltext メタプロパティを除き、メタプロパティ属性ごとに 1 つの列が含まれます。
メタプロパティ属性の一部は、処理目的で使用されます。 たとえば、 xmltext メタプロパティ属性はオーバーフロー処理に使用されます。 オーバーフロー処理は、ドキュメント内の未処理の未処理データを指します。 OPENXML によって生成される行セット内の列の 1 つは、オーバーフロー列として識別できます。 これを行うには、ColPattern パラメーターを使用して xmltext メタプロパティにマッピングします。 その後、列はオーバーフロー データを受け取ります。 flags パラメーターは、列にすべてを含めるか、未使用のデータのみを含むかを決定します。
次の表に、解析された各 XML 要素が所有するメタプロパティ属性を示します。 これらのメタプロパティ属性には、名前空間 urn:schemas-microsoft-com:xml-metaprop を使用してアクセスできます。 これらのメタプロパティを使用して XML ドキュメント内でユーザーが直接設定した値は無視されます。
注
これらのメタプロパティは、どの XPath ナビゲーションでも参照できません。
| メタプロパティ属性 | 説明 |
|---|---|
| @mp:id | DOM ノードのシステム生成のドキュメント全体の識別子を提供します。 ドキュメントが再解析されない限り、この ID は同じ XML ノードを参照します。 XML ID が 0 の場合は、要素がルート要素であることを示します。 その親 XML ID は NULL です。 |
| @mp:localname | ノードの名前のローカル部分を格納します。 プレフィックスと名前空間 URI と共に使用して、要素または属性ノードに名前を付けます。 |
| @mp:namespaceuri | 現在の要素の名前空間 URI を提供します。 この属性の値が NULL の場合、名前空間は存在しません |
| @mp:prefix | 現在の要素名の名前空間プレフィックスを格納します。 プレフィックスが存在せず (NULL)、URI が指定されている場合は、指定した名前空間が既定の名前空間であることを示します。 URI が指定されていない場合、名前空間はアタッチされません。 |
| @mp:prev | ノードを基準とした前の兄弟を格納します。 これにより、ドキュメント内の要素の順序に関する情報が提供されます。 @mp:prev には、同じ親要素を持つ前の兄弟の XML ID が含まれています。 要素が兄弟リストの先頭にある場合、 @mp:prev は NULL です。 |
| @mp:xmltext | 処理目的で使用されます。 これは、OPENXML のオーバーフロー処理で使用される要素とその属性、およびサブ要素のテキストシリアル化です。 |
次の表は、提供され、階層に関する情報を取得できる追加の親プロパティを示しています。
| 親メタプロパティ属性 | 説明 |
|---|---|
| @mp:parentid | に対応します 。/@mp:id |
| @mp:parentlocalname | に対応します 。/@mp:localname |
| @mp:parentnamespacerui | ../@mp:namespaceuri に対応します |
| @mp:parentprefix | ../@mp:prefix に対応します。 |
例示
次の例は、OPENXML を使用してさまざまな行セット ビューを作成する方法を示しています。
A。 OPENXML 行セット列をメタプロパティにマッピングする
この例では、OPENXML を使用して、サンプル XML ドキュメントの行セット ビューを作成します。 具体的には、 ColPattern パラメーターを使用して、さまざまなメタプロパティ属性を OPENXML ステートメントの行セット列にマップする方法を示します。
OPENXML ステートメントは、次の例を示しています。
id 列は、@mp:id メタプロパティ属性にマップされ、その列に要素のシステム生成の一意の XML ID が含まれていることを示します。
親列は @mp:parentid にマップされ、その列に要素の親の XML ID が含まれていることを示します。
parentLocalName 列は @mp:parentlocalname にマップされ、その列に親のローカル名が含まれていることを示します。
SELECT ステートメントは、OPENXML によって提供される行セットを返します。
DECLARE @idoc int
DECLARE @doc nvarchar(1000)
-- Sample XML document
SET @doc = N'<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
WITH (id int '@mp:id',
oid char(5),
date datetime,
amount real,
parentIDNo int '@mp:parentid',
parentLocalName varchar(40) '@mp:parentlocalname')
EXEC sp_xml_removedocument @idoc
結果を次に示します。
id oid date amount parentIDNo parentLocalName
--- ------- ---------------------- ---------- ------------ ---------------
6 O1 1996-01-20 00:00:00.000 3.5 2 Customer
10 O2 1997-04-30 00:00:00.000 13.4 2 Customer
19 O3 1999-07-14 00:00:00.000 100.0 15 Customer
25 O4 1996-01-20 00:00:00.000 10000.0 15 Customer
B. XML ドキュメント全体の取得
この例では、OPENXML を使用して、サンプル XML ドキュメントの 1 列の行セット ビューを作成します。 この列 Col1 は xmltext メタプロパティにマップされ、オーバーフロー列になります。 その結果、列は未使用のデータを受け取ります。 この場合は、ドキュメント全体です。
その後、SELECT ステートメントは完全な行セットを返します。
DECLARE @idoc int
DECLARE @doc nvarchar(1000)
SET @doc = N'<?xml version="1.0"?>
<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very
satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue
white red">
<MyTag>Testing to see if all the subelements are returned</MyTag>
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/')
WITH (Col1 ntext '@mp:xmltext')
XML 宣言なしでドキュメント全体を取得するには、次のようにクエリを指定できます。
SELECT *
FROM OPENXML (@idoc, '/root')
WITH (Col1 ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc
このクエリは、ルートという名前のルート要素と、ルート要素に含まれるデータを返します。
C. 列内の未使用のデータを取得する xmltext メタプロパティを指定する
この例では、OPENXML を使用して、サンプル XML ドキュメントの行セット ビューを作成します。 この例では、OPENXML の行セット列に xmltext メタプロパティ属性をマッピングして、未使用の XML データを取得する方法を示します。
コメント列は、@mp:xmltext メタプロパティにマッピングすることで、オーバーフロー列として識別されます。 flags パラメーターは 9 (XML_ATTRIBUTE および XML_NOCOPY) に設定されています。 これは 属性中心の マッピングを示し、未使用のデータのみをオーバーフロー列にコピーする必要があることを示します。
その後、SELECT ステートメントは OPENXML によって提供される行セットを返します。
この例では、OPENXML によって生成された行セット内の列 ParentLocalName に対して、@mp:parentlocalname メタプロパティが設定されています。 その結果、この列には親要素のローカル名が含まれます。
行セットには、 親 と コメントの 2 つの列が追加で指定されています。 親列は @mp:parentid にマップされ、その列に要素の親要素の XML ID が含まれていることを示します。 コメント列は、 @mp:xmltext メタプロパティにマッピングすることで、オーバーフロー列として識別されます。
DECLARE @idoc int
DECLARE @doc nvarchar(1000)
-- sample XML document
SET @doc = N'<root>
<Customer cid= "C1" name="Janine" city="Issaquah">
<Order oid="O1" date="1/20/1996" amount="3.5" />
<Order oid="O2" date="4/30/1997" amount="13.4">Customer was very satisfied</Order>
</Customer>
<Customer cid="C2" name="Ursula" city="Oelde" >
<Order oid="O3" date="7/14/1999" amount="100" note="Wrap it blue white red">
<Urgency>Important</Urgency>
</Order>
<Order oid="O4" date="1/20/1996" amount="10000"/>
</Customer>
</root>
'
-- Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
-- Execute a SELECT statement using OPENXML rowset provider.
SELECT *
FROM OPENXML (@idoc, '/root/Customer/Order', 9)
WITH (oid char(5),
date datetime,
comment ntext '@mp:xmltext')
EXEC sp_xml_removedocument @idoc
結果は次のとおりです。 oid 列と日付列は既に使用されているため、オーバーフロー列には表示されません。
oid date comment
----- --------------------------- ----------------------------------------
O1 1996-01-20 00:00:00.000 <Order amount="3.5"/>
O2 1997-04-30 00:00:00.000 <Order amount="13.4">Customer was very
satisfied</Order>
O3 1999-07-14 00:00:00.000 <Order amount="100" note="Wrap it blue
white red"><Urgency>
Important</Urgency></Order>
O4 1996-01-20 00:00:00.000 <Order amount="10000"/>