创建 XML 数据类型的变量和列

适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例

xml 数据类型是 SQL Server 中的内置数据类型,在某些方面类似于其他内置类型(如 intvarchar)。 对于其他内置类型,在作为变量类型、参数类型、函数返回类型或在 CAST 和 CONVERT 中创建表时,可以使用 xml数据类型作为列类型。

创建列和变量

若要创建 xml 类型列作为表的一部分,请使用 CREATE TABLE 语句,如下例所示:

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

可以使用 DECLARE statement 创建 xml 类型的变量,如下例所示。

DECLARE @x xml;

可以通过指定 XML 架构集合创建类型化的 xml 变量,如下例所示。

DECLARE @x xml (Sales.StoreSurveySchemaCollection)

若要将 xml 类型参数传递给存储过程,请使用 CREATE PROCEDURE 语句,如下例所示。

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

可以使用 XQuery 来查询存储在列、参数或变量中的 XML 实例。 还可以使用 XML 数据操作语言 (XML DML) 对 XML 实例进行更新。 由于开发时 XQuery 标准未定义 XQuery DML,因此,SQL Server 将 XML 数据修改语言 扩展 引入了 XQuery。 这些扩展插件使您可以执行插入、更新和删除操作。

分配默认的 XML 实例

在表中,可以为 xml 类型的列分配默认 XML 实例。 可以通过两种方式提供默认的 XML:通过使用 XML 常量,或通过使用到 xml 类型的显式转换。

若要提供默认的 XML 作为 XML 常量,请使用下例所示的语法。 此字符串将使用 CAST 显式转换为 xml 类型。

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

若要提供默认的 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 架构中表达业务规则。 例如,花店的交货地址必须在其营业地点周围 50 英里之内。 这可以编写为 XML 列的约束。 此约束可能涉及 xml 数据类型方法。

  • 您的约束涉及表中的其他 XML 列或非 XML 列。 例如,强制在 XML 实例中找到的客户 ID (/Customer/@CustId) 与 CustomerID 关系列中的值匹配。

可以为类型化或非类型化的 xml 数据类型列指定约束。 但在指定约束时,不能使用 XML 数据类型方法

xml 数据类型不支持以下列和表约束:

  • PRIMARY KEY/ FOREIGN KEY

  • UNIQUE

  • COLLATE

    XML 提供了它自己的编码。 排序规则只适用于字符串类型。 xml 数据类型不是字符串类型。 但是,它有字符串表示形式并允许与字符串数据类型之间的相互转换。

  • RULE

除了使用约束外,还可以创建用户定义函数作为包装来包装 xml 数据类型方法,并在检查约束中指定用户定义函数,如下例中所示。

在以下示例中, Col2 的约束指定此列中存储的每个 XML 实例都必须具有包含 <ProductDescription> 属性的 ProductID 元素。 此约束由如下用户定义函数强制执行:

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 />');

相同或不同的表

可以在包含其他关系列的表中,或在与主表具有外键关系的单独表中创建 xml 数据类型列。

当符合下列条件之一时,将在同一个表中创建 xml 数据类型列:

  • 你的应用程序将对 XML 列执行数据检索,并且不需要 XML 列的 XML 索引。

  • 您想要对 xml 数据类型列生成 XML 索引,并且主表的主键与它的聚集键相同。 有关详细信息,请参阅 XML 索引 (SQL Server)

如果符合下列条件,则在单独的表中创建 xml 数据类型列:

  • 你希望为 xml 数据类型列生成 XML 索引,但是主表的主键与其聚集键不同,或者主表没有主键,或者主表为一个堆(没有聚集键)。 如果主表已存在,可能会这样。

  • 你不希望因为表中存在 XML 列而降低表扫描的速度。 无论该列是存储在行内还是行外,都会占用空间。