分享方式:


建立 XML 資料的執行個體

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體

本文描述如何產生 XML 執行個體。

在 SQL Server 中,您可以用下列方式產生 XML 執行個體:

  • 類型轉換字串執行個體。
  • 使用有 FOR XML 子句的 SELECT 陳述式。
  • 使用常數指派。
  • 使用大量載入。

類型轉換字串和二進位執行個體

您可以將任何 SQL Server 字串資料型別,例如 [n]varchar[n]char[n]textvarbinaryimage 剖析成 xml 資料類型,方法是將 (CAST) 或字串 (CONVERT) 轉換成 xml 資料類型。 系統將會檢查不具類型的 XML 以確認其格式是否正確。 如果有與 xml 類型相關聯的結構描述,也會執行驗證。 如需其他資訊,請參閱比較具類型的 XML 與不具類型的 XML

XML 文件可以使用不同的編碼 (例如 UTF-8、UTF-16、windows-1252) 加以編碼。 以下是字串與二進位來源類型如何與 XML 文件編碼互動以及剖析器作用方式的規則。

由於 nvarchar 假設 2 位元組的 Unicode 編碼 (例如 UTF-16 或 UCS-2),XML 剖析器會將字串值視為 2 位元組的 Unicode 編碼 XML 文件或片段。 XML 文件也必須以 2 位元組的 Unicode 編碼加以編碼,才能與來源資料類型相容。 雖然 UTF-16 編碼的 XML 文件可有 UTF-16 位元組順序標記 (BOM),但並不需要,因為來源類型的內容已經清楚表示只能是 2 位元組的 Unicode 編碼文件。

XML 剖析器將 varchar 字串的內容視為 1 位元組編碼的 XML 文件/片段。 由於 varchar 來源字串有相關聯的字碼頁,因此剖析器會在 XML 本身未指定明確編碼時使用該字碼頁進行編碼。 如果 XML 執行個體有 BOM 或編碼宣告,則 BOM 或宣告必須與字碼頁一致,否則剖析器會報告錯誤。

varbinary 的內容會被視為是直接傳送至 XML 剖析器的字碼指標資料流。 因此,XML 文件或片段必須以內嵌方式提供 BOM 或其他編碼資訊。 剖析器只會查看資料流來決定編碼。 這表示 UTF-16 編碼的 XML 必須提供 UTF-16 BOM,不具有 BOM 和宣告編碼的執行個體會被解譯為 UTF-8。

如果事先不知道 XML 文件的編碼,且在轉換成 XML 之前,將資料傳遞為字串或二進位資料而非 XML 資料,則應將資料視為 varbinary。 例如,使用 OpenRowset() 讀取 XML 檔案的資料時,必須將要讀取的資料指定為 varbinary(max) 值:

SELECT CAST(x AS XML)
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

SQL Server 在內部是以 UTF-16 編碼之有效率的二進位表示法來表示 XML。 不會保留使用者提供的編碼,但是會在剖析過程中考慮該編碼。

類型轉換 CLR 使用者定義型別

如果 CLR 使用者定義型別具有 XML 序列化,即可將該類型的執行個體明確轉換成 XML 資料類型。 如需有關 CLR 使用者定義型別之 XML 序列化的詳細資料,請參閱從 CLR 資料庫物件進行 XML 序列化

處理具類型 XML 中的空白字元

在 SQL Server 中,元素內容中的空白字元如果發生在以標記 (如開始或結束標記) 所分隔的僅空白字元資料序列內,且並未實體化,則會將它略過。 (將會忽略 CDATA 區段。) 空白字元處理的方式與 XML 1.0 規格 (由全球資訊網協會 (W3C) 所發佈) 所述的空白字元處理方式不同。 這是因為 SQL Server 中的 XML 剖析器只能辨識有限的 DTD 子集數目,如 XML 1.0 中所定義。 如需有關 SQL Server 中所支援之有限 DTD 子集的其他資訊,請參閱 CAST 和 CONVERT

依預設,只要下列任一選項為真,當 XML 剖析器將字串資料轉換成 XML 時,將會捨棄無意義的空白字元:

  • xml:space 屬性並未在元素或其上階項目中定義。

  • 在某個元素或在其中一個它的上階元素生效的 xml:space 屬性,具有預設值。

例如:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

結果集如下所示。

<root><child/></root>

然而,您可以變更此行為。 若要保留 XML DT 執行個體的空白字元,請使用 CONVERT 運算子並將其選擇性的 style 參數值設為 1。 例如:

SELECT CONVERT(XML, N'<root>      <child/>     </root>', 1);

如果未使用 style 參數或是將其值設為 0,在轉換 xml DT 執行個體時,不會保留無意義的空白字元。 如需如何使用 CONVERT 運算子,以及將字串資料轉換成 xml DT 執行個體時其 style 參數的其他資訊,請參閱 CAST 和 CONVERT

範例:將字串值轉換成具類型的 xml 並將它指派給資料行

下列範例將含有 XML 片段的字串變數轉換成 xml 資料類型,然後在 xml 類型資料行中予以儲存:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);
GO

DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

下列插入作業會將字串隱含轉換成 xml 類型:

INSERT INTO T
VALUES (3, @s);

您可以明確使用 CAST 將字串轉換成 xml 類型:

INSERT INTO T
VALUES (3, CAST(@s AS XML));

或者您可以使用 CONVERT,如下列程式碼範例所示:

INSERT INTO T
VALUES (3, CONVERT(XML, @s));

範例:將字串轉換成具類型的 xml,並將其指派給變數

在下列範例中,字串會轉換成 xml 類型,並受指派給 xml 的變數。

DECLARE @x XML;
DECLARE @s VARCHAR(100);

SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);

SELECT @x;

使用含有 FOR XML 子句的 SELECT 陳述式

您可以在 SELECT 陳述式中使用 FOR XML XML 子句,以 XML 的方式傳回結果。 例如:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT Column1, Column2
        FROM Table1, Table2
        WHERE <some_condition>
        FOR XML AUTO
)
...;

SELECT 陳述式會傳回文字 XML 片段,該片段會在指派期間剖析成 xml 資料類型變數。

您也可以在 FOR XML 查詢中使用 TYPE 指示詞FOR XML 子句會以 xml 類型直接傳回 FOR XML 結果:

DECLARE @xmlDoc XML;

SET @xmlDoc = (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT @xmlDoc;

結果集如下所示。

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

在下列範例中,FOR XML 查詢之具類型的 xml 結果會插入 xml 類型資料行:

CREATE TABLE T1 (
    c1 INT,
    c2 XML
);
GO

INSERT T1 (c1, c2)
SELECT 1, (
        SELECT ProductModelID, Name
        FROM Production.ProductModel
        WHERE ProductModelID = 19
        FOR XML AUTO, TYPE
);

SELECT *
FROM T1;
GO

如需 FOR XML 的其他資訊,請參閱 FOR XML (SQL Server)

注意

SQL Server 將 xml 資料類型執行個體傳回用戶端,作為不同伺服器建構的結果,例如使用 TYPE 指示詞的 FOR XML 查詢,或者使用 xml 資料類型從 SQL Server Database Engine 資料行、變數和輸出參數傳回 XML。 在用戶端應用程式的程式碼中,ADO.NET 提供者會要求從伺服器以二進位編碼傳送這項 xml 資料類型資訊。 然而,若您使用的 FOR XML 不含 TYPE 指示詞,XML 資料就會以字串類型傳回。 在任一情況下,用戶端提供者將永遠可以處理任一 XML 形式。

使用常數指派

在應有 xml 資料類型的執行個體中可以使用字串常數。 這個作業與使用 CAST 將字串隱含轉換成 XML 是相同的。 例如:

DECLARE @xmlDoc XML;

SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

上述範例將字串隱含轉換成 xml 資料類型,並將其指派給 xml 類型變數。

下列範例會將常數字串插入 xml 類型資料行:

CREATE TABLE T (
    c1 INT PRIMARY KEY,
    c2 XML
);

INSERT INTO T
VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

注意

對於具類型的 XML,將會針對指定的結構描述驗證 XML。 如需其他資訊,請參閱比較具類型的 XML 與不具類型的 XML

XML 大量載入

增強的 OPENROWSET 功能,可讓您在資料庫中大量載入 XML 文件。 您可以從檔案將 XML 執行個體大量載入資料庫中的 xml 類型資料行。 如需實用範例,請參閱大量匯入與匯出 XML 文件的範例 (SQL Server)。 如需有關載入 XML 文件的其他資訊,請參閱載入 XML 資料

本節內容

文章 描述
XML 查詢選項和保留的資料 描述當 XML 執行個體儲存於資料庫中時,未保留的 XML 執行個體部分。