sp_xml_preparedocument (Transact-SQL)

適用対象:SQL ServerAzure SQL Database

入力として指定された XML テキストを読み取り、MSXML パーサー (msxmlsql.dll) を使用してテキストを解析し、解析されたドキュメントを使用できる状態で提供します。 この解析されたドキュメントは、XML ドキュメント内のさまざまなノード (要素、属性、テキスト、コメントなど) のツリー表現です。

sp_xml_preparedocument は、XML ドキュメントの新しく作成された内部表現にアクセスするために使用できるハンドルを返します。 このハンドルは、セッション中、または実行中 sp_xml_removedocumentにハンドルが無効になるまで有効です。

解析されたドキュメントは、SQL Server の内部キャッシュに格納されます。 MSXML パーサーは、SQL Server で使用可能な合計メモリの 8 分の 1 を使用できます。 メモリ不足を回避するには、ドキュメントが不要になったらすぐにメモリを解放するように実行 sp_xml_removedocument します。 多くの場合、nodes() メソッドの方が適切な代替方法であり、メモリの過剰な使用を回避するのに役立ちます。

下位互換性のために、 sp_xml_preparedocument 属性内の CR (char(13)) 文字と LF () 文字がchar(10)エンティティ化されている場合でも折りたたまれます。

Note

sp_xml_preparedocument び出される XML パーサーは、内部 DTD とエンティティ宣言を解析できます。 悪意を持って構築された DTD とエンティティ宣言を使用してサービス拒否攻撃を実行できるため、信頼されていないソース sp_xml_preparedocumentから XML ドキュメントを直接渡さないことを強くお勧めします。

再帰エンティティ拡張攻撃を軽減するために、 sp_xml_preparedocument ドキュメントの最上位レベルにある 1 つのエンティティの下に展開できるエンティティの数を 10,000 個に制限します。 この制限は、文字エンティティまたは数値エンティティには適用されません。 この制限により、多数のエンティティ参照を持つドキュメントを格納できますが、1 つのエンティティが 10,000 個を超える拡張チェーンで再帰的に展開されるのを防ぐことができます。

sp_xml_preparedocument は、一度に開くことができる要素の数を 256 に制限します。

Transact-SQL 構文表記規則

構文

sp_xml_preparedocument hdoc OUTPUT
    [ , xmltext ]
    [ , xpath_namespaces ]
[ ; ]

引数

hdoc

新しく作成されたドキュメントのハンドル。 hdoc は整数です。

[ xmltext ]

元の XML ドキュメント。 MSXML パーサーは、この XML ドキュメントを解析します。 xmltext は、char、nchar、varcharnvarchar、text、ntextxml のテキスト パラメーターです。 既定値は NULL です。この場合、空の XML ドキュメントの内部表現が作成されます。

Note

sp_xml_preparedocument では、テキストまたは型指定されていない XML のみを処理できます。 入力値として使用するインスタンス値が既に型指定された XML である場合は、まずその値を、型指定されない新しい XML インスタンスまたは文字列にキャストし、その後入力値として渡します。 詳細については、「 型指定された XML と型指定されていない XML の比較」を参照してください。

[ xpath_namespaces ]

OPENXML の行および列 XPath 式で使用される名前空間宣言を指定します。 xpath_namespacesは、char、nchar、varcharnvarchar、text、ntextxml のテキスト パラメーターです。

既定値は <root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop"> です。 xpath_namespacesは、OPENXML の XPath 式で使用されるプレフィックスの名前空間 URI と、整形式の XML ドキュメントを提供します。 xpath_namespaces名前空間を参照するために使用する必要があるプレフィックスをurn:schemas-microsoft-com:xml-metaprop宣言します。これにより、解析された XML 要素に関するメタデータが提供されます。 この手法を使用してメタプロパティ名前空間の名前空間プレフィックスを再定義できますが、この名前空間は失われません。 プレフィックスmpは、xpath_namespacesにそのような宣言が含まれている場合でも有効ですurn:schemas-microsoft-com:xml-metaprop

リターン コードの値

0 (成功) または > 0 (失敗)。

アクセス許可

ロール public のメンバーシップが必要です。

A. 整形式 XML ドキュメントの内部表現を準備する

次の例では、入力として提供される XML ドキュメントの新しく作成された内部表現へのハンドルを返します。 sp_xml_preparedocument の呼び出しでは、既定の名前空間プレフィックス マッピングを使用します。

DECLARE @hdoc INT;
DECLARE @doc VARCHAR(1000);

SET @doc = '
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5" OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3" OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>';

--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

-- Remove the internal representation.
EXEC sp_xml_removedocument @hdoc;

B. DTD を使用して整形式 XML ドキュメントの内部表現を準備する

次の例では、入力として提供される XML ドキュメントの新しく作成された内部表現へのハンドルを返します。 ストアド プロシージャは、ドキュメントに含まれる DTD に対して読み込まれたドキュメントを検証します。 sp_xml_preparedocument の呼び出しでは、既定の名前空間プレフィックス マッピングを使用します。

DECLARE @hdoc int;
DECLARE @doc varchar(2000);
SET @doc = '
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE root
[<!ELEMENT root (Customers)*>
<!ELEMENT Customers EMPTY>
<!ATTLIST Customers CustomerID CDATA #IMPLIED ContactName CDATA #IMPLIED>]>
<root>
<Customers CustomerID="ALFKI" ContactName="Maria Anders"/>
</root>';

EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc;

C: 名前空間 URI を指定する

次の例では、入力として提供される XML ドキュメントの新しく作成された内部表現へのハンドルを返します。 メタプロパティ名前空間マッピングの sp_xml_preparedocument プレフィックスを mp 保持し、マッピング プレフィックスを xyz 名前空間 urn:MyNamespaceに追加する呼び出し。

DECLARE @hdoc int;
DECLARE @doc varchar(1000);
SET @doc ='
<ROOT>
<Customer CustomerID="VINET" ContactName="Paul Henriot">
   <Order CustomerID="VINET" EmployeeID="5"
           OrderDate="1996-07-04T00:00:00">
      <OrderDetail OrderID="10248" ProductID="11" Quantity="12"/>
      <OrderDetail OrderID="10248" ProductID="42" Quantity="10"/>
   </Order>
</Customer>
<Customer CustomerID="LILAS" ContactName="Carlos Gonzlez">
   <Order CustomerID="LILAS" EmployeeID="3"
           OrderDate="1996-08-16T00:00:00">
      <OrderDetail OrderID="10283" ProductID="72" Quantity="3"/>
   </Order>
</Customer>
</ROOT>'
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument @hdoc OUTPUT, @doc, '<ROOT xmlns:xyz="urn:MyNamespace"/>';