XML 資料類型

xml 資料類型可讓您在 SQL Server 資料庫中儲存 XML 文件和片段。XML 片段是遺漏單一最上層元素的 XML 執行個體。您可以在其中建立 xml 類型的資料行與變數並儲存 XML 執行個體。請注意 xml 資料類型執行個體的預存表示法不能超過 2 GB。

您可以選擇性地將 XML 結構描述集合與資料行、參數或 xml 資料類型的變數關聯。在集合中的結構描述是用以驗證 XML 執行個體並設定其類型。在此情況下,XML 應該是具類型的。

xml 資料類型和相關的方法可協助將 XML 整合至 SQL Server 的關聯式架構。如需詳細資訊,請參閱<xml 資料類型方法>。

ms189887.note(zh-tw,SQL.90).gif附註:
本主題描述不具類型的 XML。如需具 XML 類型的詳細資訊,請參閱<具類型與不具類型的 XML>。

建立 xml 資料類型變數和資料行

xml 資料類型是 SQL Server 中的內建資料類型,而且與其他內建類型有些相似,例如 intvarchar。透過搭配其他內建類型的使用,您可以在建立資料表以做為變數類型、參數類型、函數傳回類型,或是在 CAST 與 CONVERT 時,使用 xml 資料類型做為資料行類型。使用這些的方式如下列範例所示。

範例 A

建立 xml 類型的資料行:

CREATE TABLE T1(Col1 int primary key, Col2 xml) 

範例 B

建立 xml 類型的變數:

DECLARE @x xml 

指定 XML 結構描述集合以建立具 xml 類型的變數:

declare @x xml (Sales.StoreSurveySchemaCollection)

範例 C

傳遞 xml 類型的參數至預存程序:

CREATE PROCEDURE SampleProc(@XmlDoc xml) AS ... 

您可以使用 XQuery 來查詢儲存在資料行、參數或變數的 XML 執行個體中。您也可以使用「XML 資料操作語言」(XML DML) 將更新套用至 XML 執行個體。由於 XQuery 標準在開發時並不會定義 XQuery DML,因此 SQL Server 推出 XQuery 的 XML 資料修改語言延伸模組。這些延伸模組可讓您執行插入、更新和刪除作業。

指派預設值

在資料表中,您可以將預設的 XML 執行個體指派給 xml 類型的資料行。您可以使用如下所示的兩種方法之一來提供預設的 XML:

範例 A

以 XML 常數提供預設的 XML (該字串隱含地 CAST 成 xml 類型):

CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')

範例 B

提供預設的 XML 以明確地 CASTxml

CREATE TABLE T (XmlColumn xml 
                  default CAST(N'<element1/><element2/>' AS xml))

SQL Server 也支援在 xml 類型之資料行上的 NULL 和 NOT NULL 條件約束。例如:

CREATE TABLE T (XmlColumn xml NOT NULL)

指定條件約束

當您建立 xml 類型的資料行時,您可以定義資料行層級或資料表層級的條件約束。不過,在指定條件約束時無法使用 XML 資料類型方法。替代方法為建立包裝函式、使用者自訂函數以包裝 xml 資料類型方法,並在檢查條件約束中指定使用者自訂函數,如下列範例所示。

在下列範例中,在 Col2 上的條件約束指定了儲存在此資料行中的每個 XML 執行個體必須有包含 ProductID 屬性的 <ProductDescription> 元素。此條件約束是由使用者自訂函數所強制執行:

CREATE FUNCTION my_udf(@var xml) returns bit
AS BEGIN 
RETURN @var.exist('/ProductDescription/@ProductID')
END
GO

請注意如果在執行個體中的 <ProductDescription> 元素包含 ProductID 屬性,xml 資料類型的 exist() 方法會傳回 1。否則它會傳回 0

現在,您可以使用下列資料行層級的條件約束來建立資料表:

CREATE TABLE T (
    Col1 int primary key, 
    Col2 xml check(dbo.my_udf(Col2)=1))
GO

下列插入會成功:

INSERT INTO T values(1,'<ProductDescription ProductID="1" />')

由於條件約束之故,下列插入會失敗:

INSERT INTO T values(1,'<Product />')

修改資料表

ALTER TABLE 陳述式支援 xml 資料類型。例如,您可以將任何字串類型資料行修改成 xml 資料類型。請注意在這些情況下,資料行中所包含的文件必須格式正確。另外,如果您要將資料行的類型從字串變更為具 xml 類型,將會根據指定的 XSD 結構描述來驗證資料行中的文件。

CREATE TABLE T (Col1 int primary key, Col2 nvarchar(max))
GO
INSERT INTO T 
VALUES (1, '<Root><Product ProductID="1"/></Root>')
GO
ALTER TABLE T 
ALTER COLUMN Col2 xml
GO

您可以將 xml 類型的資料行從不具類型的 XML 變更為具 XML 類型。例如:

CREATE TABLE T (Col1 int primary key, Col2 xml)
GO
INSERT INTO T 
values (1, '<p1:ProductDescription ProductModelID="1" 
xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
            </p1:ProductDescription>')
GO 
-- Make it a typed xml column by specifying a schema collection.
ALTER TABLE T 
ALTER COLUMN Col2 xml (Production.ProductDescriptionSchemaCollection)
GO
ms189887.note(zh-tw,SQL.90).gif附註:
指令碼將會針對 AdventureWorks 資料庫來執行,因為所建立的 XML 結構描述集合 Production.ProductDescriptionSchemaCollection 是屬於 AdventureWorks 資料庫的一部份。

在上述範例中,將會根據指定集合中的 XSD 結構描述,來驗證所有儲存在資料行中的執行個體並設定其類型。根據指定的結構描述,如果資料行包含一或多個無效的 XML 執行個體,ALTER TABLE 陳述式將會失敗,而且將無法使不具類型的 XML 資料行變更為具類型的 XML。

ms189887.note(zh-tw,SQL.90).gif附註:
如果資料表很大,修改 xml 類型的資料行可能會很費時。這是因為每個文件都必須檢查其格式是否正確、是否具 XML 類型,而且也必須加以驗證。

如需有關具 XML 類型的詳細資訊,請參閱<具類型與不具類型的 XML>。

建立資料檢視表

您可以使用 xml 類型的資料行來建立檢視。下列範例會建立一個檢視,在此檢視中使用了 xml 資料類型的 value() 方法來擷取 xml 類型的資料行。

-- Create the table.
CREATE TABLE T (
    ProductID          int primary key, 
    CatalogDescription xml)
GO
-- Insert sample data.
INSERT INTO T values(1,'<ProductDescription ProductID="1" ProductName="SomeName" />')
GO
-- Create view (note the value() method used to retrieve ProductName 
-- attribute value from the XML).
CREATE VIEW MyView AS 
  SELECT ProductID,
         CatalogDescription.value('(/ProductDescription/@ProductName)[1]', 'varchar(40)') AS PName
  FROM T
GO 

針對檢視執行下列查詢:

SELECT * 
FROM   MyView

以下是結果:

ProductID   PName      
----------- ------------
1           SomeName 
ms189887.note(zh-tw,SQL.90).gif附註:
xml 資料類型無法用於「分散式資料分割檢視」。

使用計算資料行中的 XML

XML 執行個體可以計算資料行的來源或計算資料行的類型來出現。例如,在下列 CREATE TABLE 陳述式中,從 col1 計算出 xml 類型資料行 (col2):

CREATE TABLE T(col1 varchar(max), col2 AS CAST(col1 AS xml) )  

xml 資料類型也可以建立計算資料行的來源出現,如下列 CREATE TABLE 陳述式所示:

CREATE TABLE T (col1 xml, col2 as cast(col1 as varchar(1000) )) 

您可以從 xml 類型的資料行擷取值以建立計算資料行,如下列範例所示。因為 xml 資料類型方法無法直接用來建立計算資料行,本範例先定義一個函數 (my_udf),以傳回 XML 執行個體的值。該函數會包裝 xml 類型的 value() 方法。接著會在計算資料行的 CREATE TABLE 陳述式中指定函數名稱。

CREATE FUNCTION my_udf(@var xml) returns int
AS BEGIN 
RETURN @var.value('(/ProductDescription/@ProductModelID)[1]' , 'int')
END
GO
-- Use the function in CREATE TABLE.
CREATE TABLE T (col1 xml, col2 as dbo.my_udf(col1) )
GO
-- Try adding a row. 
INSERT INTO T values('<ProductDescription ProductModelID="1" />')
GO
-- Verify results.
SELECT col2, col1
FROM T
 

就如同上述範例,下列範例定義一個函數,以傳回計算資料行的 xml 類型執行個體。在函數中,xml 資料類型的 query() 方法會擷取 xml 類型參數中的值。

CREATE FUNCTION my_udf(@var xml) 
  RETURNS xml AS 
BEGIN 
   RETURN @var.query('ProductDescription/Features')
END

在下列 CREATE TABLE 陳述式中,Col2 是一個計算資料行,它使用了該函數所傳回的 XML 資料 (<Features> 元素):

CREATE TABLE T (Col1 xml, Col2 as dbo.my_udf(Col1) )
-- Insert a row in table T.
INSERT INTO T VALUES('
<ProductDescription ProductModelID="1" >
  <Features>
    <Feature1>description</Feature1>
    <Feature2>description</Feature2>
  </Features>
</ProductDescription>')
-- Verify the results.
SELECT *
FROM T

請參閱

參考

使用 FOR XML 與 OPENXML 發行和處理 XML 資料

概念

具類型與不具類型的 XML
產生 XML 執行個體
XML 資料修改語言 (XML DML)
xml 資料類型資料行上的索引
XML 應用程式範例

其他資源

xml 資料類型方法

說明及資訊

取得 SQL Server 2005 協助