比較具類型的 XML 與不具類型的 XML
適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
您可以建立 XML 類型的變數、參數和資料行。 此外,也可以選擇性地將 XML 結構描述的集合與 XML 類型的變數、參數和資料行建立關聯。 在此情況下,此 XML 資料類型的執行個體即稱為「類型化」。 不屬於此類的 XML 實例稱為「未定類型」。
格式正確的 XML 和 XML 資料類型
XML 資料類型會實作 ISO 標準 XML 資料類型。 因此,它可以在不具類型的 XML 資料行中儲存格式良好的 XML 1.0 版文件,也可以儲存含有文字節點和任意數量之最上層元素的所謂 XML 內容片段。 系統會確認資料的格式正確、不需要將資料行繫結到 XML 結構描述,並拒絕在某種程度上格式不正確的資料。 對於不具類型的 XML 變數和參數而言,也是如此。
XML 結構描述
XML 結構描述提供下列項目:
驗證的條件約束 每當具類型的 xml 執行個體被指派或修改時,SQL Server 就會驗證該執行個體。
資料類型資訊 結構描述提供有關XML資料類型實例中屬性和元素類型的資訊。 這些類型資訊針對執行個體中所包含之值所提供的運算語意,要比不具類型的 XML更精確。 例如,十進位的數學運算可以在十進位值上執行,但不能在字串值上執行。 因此,具類型的 XML 儲存會比不具類型的 XML 精簡很多。
選擇類型化或非類型化的 XML
在下列情況下,請使用不具類型的 XML 資料類型:
您沒有 XML 資料的結構描述。
您有結構描述,但您不想讓伺服器驗證資料。 當應用程式在將資料儲存於伺服器之前執行用戶端驗證時,或是根據結構描述暫時儲存無效的 XML 資料時,或是在伺服器上使用不受支援的結構描述元件時,有時會有這種情形。
在下列情況下,請使用已定義類型的 XML 資料類型:
您有 XML 資料的結構描述,而且想要讓伺服器根據該 XML 結構描述來驗證 XML 資料。
您想要根據類型資訊來利用儲存和查詢的最佳化。
您想要在編譯查詢期間更有效地利用類型資訊。
具類型的 XML 資料行、參數及變數可儲存 XML 文件或內容。 但是您必須在宣告時,用旗標來指定您是要儲存文件還是內容。 此外,您也必須提供 XML 結構描述的集合。 如果每個 XML 執行個體都只有一個最上層元素,請指定 DOCUMENT。 否則,請使用 CONTENT。 查詢編譯器會在查詢編譯期間,於類型檢查中使用 DOCUMENT 旗標,以推斷單一最上層元素。
建立具類型的 XML
您必須先使用 CREATE XML SCHEMA COLLECTION (Transact-SQL) 註冊 XML 結構描述集合之後,才能夠建立具類型的 XML 變數、參數或資料行。 然後,您可以將 XML 結構描述集合與 XML 資料類型的變數、參數或資料行產生關聯。
在下列範例中,會使用兩段式命名慣例來指定 XML 結構描述集合名稱。 第一個部分是結構描述名稱,而第二個部分是 XML 結構描述集合名稱。
範例:將結構描述集合與 XML 類型變數產生關聯
下列範例會建立一個 xml 類型變數,並將結構描述集合與此變數產生關聯。 範例中指定的結構描述集合已經匯入 AdventureWorks 資料庫。
DECLARE @x xml (Production.ProductDescriptionSchemaCollection);
範例:指定 xml 型別欄位的結構定義
下列範例會建立具有 XML 類型資料行的資料表,並為此資料行指定結構描述:
CREATE TABLE T1(
Col1 int,
Col2 xml (Production.ProductDescriptionSchemaCollection));
範例:將 XML 類型的參數傳遞給預存程序
下列範例會將 XML 類型的參數傳遞給預存程序,並為此變數指定結構描述:
CREATE PROCEDURE SampleProc
@ProdDescription xml (Production.ProductDescriptionSchemaCollection)
AS
...
請注意下列有關 XML 架構集合的事項:
XML 結構描述集合只能在使用 建立 XML 結構描述集合 註冊它所在的資料庫中使用。
如果您將字串轉型為型別為 XML 的資料類型,解析作業也會根據指定集合中的 XML 架構命名空間來執行驗證和設定型別。
您可以將具類型的 XML 資料類型轉換為不具類型的 XML 資料類型,反之亦然。
如需在 SQL Server 中產生 XML 之其他方法的詳細資訊,請參閱 建立 XML 資料的執行個體。 在產生 XML 之後,可將它指派給 XML 資料類型的變數,或將它儲存在 XML 類型資料行中,以進行其他處理。
在資料類型階層中, XML 資料類型會出現在 sql_variant 和使用者定義類型的下面,但會出現在任何內建類型的上面。
範例:指定限制條件來約束 XML 類型的資料行
對於具有類型的 XML 資料行,您可以限制資料行,使儲存在其中的每個實例只能有一個單一的最上層元素。 作法是,在建立資料表時指定選擇性的 DOCUMENT
Facet,如下列範例所示:
CREATE TABLE T(Col1 xml
(DOCUMENT Production.ProductDescriptionSchemaCollection));
GO
DROP TABLE T;
GO
依預設,儲存在具類型的 XML 資料行中的執行個體會儲存為 XML 內容,而非 XML 文件。 這樣做允許以下內容:
零個或多個最上層元素
最上層元素內的文字節點
您也可以透過新增 CONTENT
facet 來明確指示這個行為,如下面的例子所示:
CREATE TABLE T(Col1 xml(CONTENT Production.ProductDescriptionSchemaCollection));
GO -- Default
您可以在任何定義 XML 類型 (具類型的 XML) 的地方,指定選擇性的 DOCUMENT/CONTENT Facet。 例如,當您建立具類型的 XML 變數時,可以加入 DOCUMENT/CONTENT 面向,如下所示:
declare @x xml (DOCUMENT Production.ProductDescriptionSchemaCollection);
文件類型定義 (DTD)
XML 資料類型的欄位、變數和參數,可以使用 XML 架構來指定類型,但不能使用 DTD。 但是,內嵌 DTD 可以用於無類型和有類型的 XML 中,以提供預設值,並將實體參考替換為其展開形式。
您可以用協力廠商工具將 DTD 轉換成 XML 結構描述文件,並將 XML 結構描述載入資料庫中。
從 SQL Server 2005 升級類型化 XML
SQL Server 2008 (10.0.x) 對於 XML 結構描述支援做了幾項擴充,其中包括支援 Lax 驗證、改良處理 xs:date、xs:time 和 xs:dateTime 執行個體資料,以及新增支援清單和等位型別。 在大多數情況下,這些變更並不會影響升級的使用體驗。 但是,如果您在 SQL Server 2005 (9.x) 中使用允許 xs:date、xs:time 或 xs:dateTime 類型 (或任何子類型) 值的 XML 結構描述集合,則當您將 SQL Server 2005 (9.x) 資料庫附加到 SQL Server 的更新版本時,會發生下列升級步驟:
對於每一個 XML 資料行而言,如果其類型來自 XML 架構描述集合,該集合包含的元素或屬性具有 xs:anyType、xs:anySimpleType、xs:date 類型或其任何子類型、xs:time 或其任何子類型、或 xs:dateTime 或其任何子類型,或者是這些類型的聯集或清單的一部分,會發生下列情況:
資料行上的所有 XML 索引都將會停用。
所有的 SQL Server 2005 (9.x) 值都將會繼續以 Z 時區來表示,因為這些值已經正規化成 Z 時區。
當重建索引時,或是針對包含該值的 XML 資料類型執行 XQuery 或 XML-DML 陳述式時,任何小於 1 年 1 月 1 日的 xs:date 或 xs:dateTime 值都會導致發生執行階段錯誤。
xs:date 或 xs:dateTime Facet 中的任何負數年份或是 XML 結構描述集合中的預設值,將會自動更新為基底 xs:date 或 xs:dateTime 類型所允許的最小值 (例如 xs:dateTime的 0001-01-01T00:00:00.0000000Z)。
您仍然可以使用 Transact-SQL SELECT 陳述式來擷取整個 XML 資料類型,即使其包含負數年份。 建議您使用新支援範圍中的年份來取代負數年份,或是將元素或屬性的類型變更為 xs:string。