xml 数据类型
使用 xml 数据类型,可以将 XML 文档和片段存储在 SQL Server 数据库中。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 将 XML 数据修改语言扩展插件引入 XQuery。这些扩展插件使您可以执行插入、更新和删除操作。
分配默认的 XML 实例
在表中,可以为 xml 类型的列分配默认 XML 实例。可以使用以下所示的两种方法之一来提供默认的 XML。
示例 A
将默认 XML 提供为 XML 常量(字符串隐式转换为 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 数据类型方法直接用于创建计算列,因此,此示例首先定义可从 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 应用程序