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

本文說明如何產生 XML 實例。

在SQL Server中,您可以透過下列方式產生 XML 實例:

  • 類型轉換字串執行個體。

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

  • 使用常數指派。

  • 使用大量載入。

    類型轉換字串和二進位實例

    您可以將任何SQL Server字串資料類型剖析為 xml 資料類型,例如 [ n ][ var ] char [n]text Varbinary image ,藉由將 (CAST) 或將 (CONVERT) 字串轉換成 xml 資料類型,以轉換成 xml 資料類型。 系統會檢查不具類型的 XML,以確認其格式正確。 如果有與 xml 類型相關聯的架構,也會執行驗證。 如需詳細資訊,請參閱 比較具類型的 XML 與不具類型的 XML

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

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

    XML 剖析器會將 varchar 字串的內容視為一個位元組編碼的 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 (Transact-SQL)

    依預設,只要下列任一項為真,當 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);
    

    如果未使用 樣式 參數,或其值設定為 0,則不會保留不重要的空白字元,以便轉換 xml DT 實例。 如需如何將字串資料轉換成 xml DT 實例時如何使用 CONVERT 運算子及其 樣式 參數的詳細資訊,請參閱 CAST 和 CONVERT (Transact-SQL)

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

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

    CREATE TABLE T(c1 int primary key, c2 xml);
    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 的結果。 例如:

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

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

    您也可以在 FOR XML 子句中使用 TYPE 指示詞 ,該子句會直接以 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);
    INSERT T1(c1, c2)
    SELECT 1, (SELECT ProductModelID, Name
               FROM Production.ProductModel
               WHERE ProductModelID = 19
               FOR XML AUTO, TYPE);
    SELECT * FROM T1;
    

    如需 FOR XML 的詳細資訊,請參閱FOR XML (SQL Server)

    SQL Server會根據不同的伺服器建構,例如使用 TYPE 指示詞的 FOR XML 查詢,或是 xml 資料類型用來從 SQL 資料行、變數和輸出參數傳回XML的結果,傳回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

    使用大量載入

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

  •