创建 XML 数据类型的变量和列
xml 数据类型是 SQL Server 中的内置数据类型,并有些类似于其他内置类型(如 int 和 varchar)。对于其他内置类型,在作为变量类型、参数类型、函数返回类型或在 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 常量,请使用下例所示的语法。请注意,此字符串将显式转换为 xml 类型。
CREATE TABLE T (XmlColumn xml default N'<element1/><element2/>')
若要提供默认的 XML 作为到 xml 的显式 CAST,请使用下例所示的语法。
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 实例都必须具有包含 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 />')
相同或不同的表
可以在包含其他关系列的表中,或在与主表具有外键关系的单独表中创建 xml 数据类型列。
当符合下列条件之一时,将在同一个表中创建 xml 数据类型列:
您的应用程序对 XML 列执行数据检索,并且不需要 XML 列的 XML 索引。
您想要对 xml 数据类型列生成 XML 索引,并且主表的主键与它的聚集键相同。有关详细信息,请参阅 XML 数据类型列的索引。
如果符合下列条件,则在单独的表中创建 xml 数据类型列:
您想要对 xml 数据类型列生成 XML 索引,但是主表的主键与它的聚集键不同,或者主表没有主键,或者主表为一个堆(没有聚集键)。如果主表已存在,可能会这样。
您不希望因为表中存在 XML 列而降低表扫描的速度。无论该列是存储在行内还是行外,都会占用空间。