Share via


sp_xml_preparedocument (Transact-SQL)

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

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

注意

解析済みのドキュメントは、SQL Server の内部キャッシュに格納されます。MSXML パーサーでは、SQL Server に割り当てられている総メモリの 8 分の 1 が使用されます。メモリ不足を回避するには、sp_xml_removedocument を実行してメモリを解放してください。

注意

旧バージョンとの互換性を維持するために、sp_xml_preparedocument では、属性内の CR (char(13)) 文字と LF (char(10)) 文字は、エンティティ化されている場合でも変換されます。

注意

sp_xml_preparedocument によって呼び出された XML パーサーを使用すると、内部 DTD とエンティティ宣言を解析できます。悪意を持って作成された DTD およびエンティティ宣言はサービス拒否攻撃に使用されることがあるので、信頼できない提供元の XML ドキュメントを sp_xml_preparedocument に直接渡さないことを強くお勧めします。

再帰的なエンティティ拡張攻撃を緩和するために、sp_xml_preparedocument によって、ドキュメントの最上位にある単一のエンティティの下で展開できるエンティティの数が 10,000 までに制限されます。この制限は、文字エンティティまたは数値エンティティには適用されません。この制限により、多数のエンティティ参照があるドキュメントを格納できるようになりますが、エンティティを再帰的に展開して、単一のエンティティで 10,000 個の展開より長いチェーンにすることはできなくなります。

注意

sp_xml_preparedocument によって、一度に開くことができる要素の数が 256 までに制限されます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

sp_xml_preparedocument
hdoc 
OUTPUT
[ , xmltext ]
[ , xpath_namespaces ] 

引数

  • hdoc
    新しく作成されたドキュメントへのハンドルを指定します。hdoc のデータ型は integer です。

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

    注意

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

  • [ xpath_namespaces ]
    OPENXML の XPath 式の行および列で使用される名前空間宣言を指定します。xpath_namespaces は、char、nchar、varchar、nvarchar、text、ntext、または xml 型のテキスト パラメータです。

    既定値は、<root xmlns:mp="urn:schemas-microsoft-com:xml-metaprop"> です。xpath_namespaces では、ウェルフォームド XML ドキュメントにより、OPENXML の XPath 式で使用されるプレフィックスに対する名前空間 URI が提供されます。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. ウェルフォームド XML ドキュメントの内部表現を DTD を使用して準備する

次の例では、入力値として提供されている、新しく作成された 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 プレフィックスが保持され、名前空間 urn:MyNamespace に対して xyz マッピング プレフィックスが追加されます。

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"/>'