XML 查詢選項和保留的資料

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體

本文說明查詢 XML 資料必須指定的查詢選項。 此外,也說明當 XML 執行個體儲存於資料庫時,未保留的 XML 執行個體部分。

設定必要的查詢選項

使用 xml 資料類型方法來查詢 xml 類型資料行或變數時,必須依下表所示,設定下列選項。

SET 選項 必要值
ANSI_NULLS 開啟
ANSI_PADDING 開啟
ANSI_WARNINGS 開啟
ARITHABORT 開啟
CONCAT_NULL_YIELDS_NULL 開啟
NUMERIC_ROUNDABORT OFF
QUOTED_IDENTIFIER 開啟

如果未將這些選項設為如上表所示,對於 xml 資料類型方法的查詢及修改都會失敗。

未保留的 XML 執行個體功能

SQL Server 會保留 XML 執行個體的內容,但是不會保留在 XML 資料模型中不視為重大之 XML 執行個體的層面。 這表示擷取的 XML 執行個體可能不等於儲存於伺服器上的執行個體,但是將會包含相同的資訊。

XML declaration - XML 宣告

若執行個體儲存於資料庫中,就不會保留執行個體中的 XML 宣告。 例如:

CREATE TABLE T1 (Col1 int primary key, Col2 xml);
GO
INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>');
GO
SELECT Col2
FROM T1;

結果為 <doc/>

將 XML 資料儲存於 <?xml version='1.0'?>資料類型執行個體內時,不會保留 XML 宣告 (例如 xml)。 這是原廠設定。 XML 宣告 () 及其屬性 (version/encoding/stand-alone) 在將資料轉換成 xml類型之後會遺失。 XML 宣告會被視為 XML 剖析器的指示詞。 XML 資料會當做 ucs-2 儲存於內部。 XML 執行個體中的所有其他 PI 都會保留下來。

屬性順序

XML 執行個體中屬性的順序不會被保留。 當您查詢 xml 類型資料行中儲存的 XML 執行個體時,產生之 XML 中的屬性順序可能會與原始 XML 執行個體不一樣。

屬性值兩側的引號

屬性值兩側的單引號與雙引號不會保留。 屬性值會當做成對的名稱/值儲存在資料庫中。 引號則不會儲存。 當您針對 XML 執行個體執行 XQuery 時,產生的 XML 會序列化並以雙引號括住屬性值。

DECLARE @x xml;
-- Use double quotation marks.
SET @x = '<root a="1" />';
SELECT @x;
GO
DECLARE @x xml;
-- Use single quotation marks.
SET @x = '<root a=''1'' />';
SELECT @x;
GO

兩個查詢都會傳回 = <root a="1" />

命名空間前置詞

命名空間前置詞不會保留。 當您針對 xml 類型的資料行指定 XQuery 時,序列化的 XML 結果可能會傳回不同的命名空間前置詞。

DECLARE @x xml;
SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
            <ns2:SomeElement/>
          </ns1:root>';
SELECT @x;
SELECT @x.query('/*');
GO

結果中的命名空間前置詞可能會不同。 例如:

<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>

另請參閱