xml 数据类型

使用 xml 数据类型,可以将 XML 文档和片段存储在 SQL Server 数据库中。XML 片段是缺少单个顶级元素的 XML 实例。您可以创建 xml 类型的列和变量,并在其中存储 XML 实例。注意,存储的 xml 数据类型表示实例大小不能超过 2 GB。

可以选择性地将 XML 架构集合与 xml 数据类型的列、参数或变量进行关联。集合中的架构用于验证和类型化 XML 实例。在这种情况下,XML 是类型化的。

xml 数据类型和关联的方法有助于将 XML 集成到 SQL Server 的关系框架。有关详细信息,请参阅 XML 数据类型方法

ms189887.note(zh-cn,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 将 XML 数据修改语言扩展插件引入 XQuery。这些扩展插件使您可以执行插入、更新和删除操作。

分配默认的 XML 实例

在表中,可以为 xml 类型的列分配默认 XML 实例。可以使用以下所示的两种方法之一来提供默认的 XML。

示例 A

将默认 XML 提供为 XML 常量(字符串隐式转换为 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-cn,SQL.90).gif注意:
将对 AdventureWorks 数据库运行脚本,因为已将 XML 架构集合 Production.ProductDescriptionSchemaCollection 创建为 AdventureWorks 数据库的一部分。

在上一个示例中,存储在列中的所有实例都将根据指定集合中的 XSD 架构来验证和类型化。如果列包含对于指定架构无效的一个或多个 XML 实例,则 ALTER TABLE 语句将失败,并且您无法将非类型化的 XML 列更改为类型化的 XML。

ms189887.note(zh-cn,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-cn,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 数据类型方法直接用于创建计算列,因此,此示例首先定义可从 XML 实例返回值的函数 (my_udf)。此函数涵盖 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 帮助