XML 資料類型
xml 資料類型可讓您在 SQL Server 資料庫中儲存 XML 文件和片段。XML 片段是遺漏單一最上層元素的 XML 執行個體。您可以在其中建立 xml 類型的資料行與變數並儲存 XML 執行個體。請注意 xml 資料類型執行個體的預存表示法不能超過 2 GB。
您可以選擇性地將 XML 結構描述集合與資料行、參數或 xml 資料類型的變數關聯。在集合中的結構描述是用以驗證 XML 執行個體並設定其類型。在此情況下,XML 應該是具類型的。
xml 資料類型和相關的方法可協助將 XML 整合至 SQL Server 的關聯式架構。如需詳細資訊,請參閱<xml 資料類型方法>。
附註: |
---|
本主題描述不具類型的 XML。如需具 XML 類型的詳細資訊,請參閱<具類型與不具類型的 XML>。 |
建立 xml 資料類型變數和資料行
xml 資料類型是 SQL Server 中的內建資料類型,而且與其他內建類型有些相似,例如 int 與 varchar。透過搭配其他內建類型的使用,您可以在建立資料表以做為變數類型、參數類型、函數傳回類型,或是在 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 以明確地 CAST
成 xml
。
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
附註: |
---|
指令碼將會針對 AdventureWorks 資料庫來執行,因為所建立的 XML 結構描述集合 Production.ProductDescriptionSchemaCollection 是屬於 AdventureWorks 資料庫的一部份。 |
在上述範例中,將會根據指定集合中的 XSD 結構描述,來驗證所有儲存在資料行中的執行個體並設定其類型。根據指定的結構描述,如果資料行包含一或多個無效的 XML 執行個體,ALTER TABLE
陳述式將會失敗,而且將無法使不具類型的 XML 資料行變更為具類型的 XML。
附註: |
---|
如果資料表很大,修改 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
附註: |
---|
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 應用程式範例