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 可用記憶體總數的八分之一。 若要避免記憶體不足,請執行 sp_xml_removedocument 以在不再需要檔時立即釋放記憶體。 在許多情況下,nodes() 方法可能是較佳的替代方法,並有助於避免過度使用記憶體。

為了保持回溯相容性, 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 是整數。

[ xmltext ]

原始 XML 檔。 MSXML 剖析器會剖析此 XML 檔。 xmltext 是 text 參數:charncharvarchar、nvarchartextntextxml。 默認值為 NULL,在此情況下會建立空白 XML 文件的內部表示法。

注意

sp_xml_preparedocument 只能處理文字或不具類型的 XML。 如果要做為輸入的實例值已經輸入 XML,請先將它轉換成新的不具類型的 XML 實例或字串,然後將該值當做輸入傳遞。 如需詳細資訊,請參閱 比較具類型的 XML 與不具類型的 XML

[ xpath_namespaces ]

指定 OPENXML 中用於資料列和資料行 XPath 表達式的命名空間宣告。 xpath_namespaces是文字參數:charncharvarchar、nvarchartextntextxml

預設值是 <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_preparedocumentmp 保留中繼屬性命名空間對應的前置詞,並將對應前置詞新增 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"/>';