XML 架构集合
XML 架构集合是关系架构作用域内的元数据实体。它包含一个或多个可能相关(如通过 <xs:import>)也可能无关的 XML 架构。XML 架构集合中各个 XML 架构通过使用其目标命名空间来标识。
XML 架构集合是通过使用 CREATE XML SCHEMA COLLECTION (Transact-SQL) 语法并提供一个或多个 XML 架构来创建。可以通过使用 ALTER XML SCHEMA COLLECTION (Transact-SQL) 语法,将多个 XML 架构组件添加到现有 XML 架构中,并将多个架构添加到 XML 架构集合中。可以通过使用 SQL Server 2005 中的安全模式像任何 SQL 对象那样保证 XML 架构集合的安全。
多类型化列
XML 架构集合 C 根据多个 XML 架构对 XML 列 xCol 进行类型化。此外,DOCUMENT 标志和 CONTENT 标志指定是否可以将 XML 树或片段分别存储在 xCol 列中。
对于 DOCUMENT,每个 XML 实例都指定实例中顶级元素的目标命名空间,XML 实例根据它来进行类型化和验证。另一方面,对于 CONTENT,每个顶级元素都可以指定 C 中任何一个目标命名空间。XML 实例根据实例中存在的所有目标命名空间来进行验证和类型化。
架构演变
XML 架构集合用于对 XML 列、变量和参数进行类型化。它提供了 XML 架构演变的机制。为了进行说明,假定您将具有目标命名空间 BOOK-V1 的 XML 架构添加到 XML 架构集合 C 中。使用 C 类型化的 XML 列 xCol 可以存储符合 BOOK-V1 架构的 XML 数据。
然后,假定某个应用程序希望用新的架构组件(如复杂类型定义和顶级元素声明)扩展 XML 架构。可以将这些新的架构组件添加到 BOOK-V1 架构中,并且不需要重新验证 xCol 列中的现有 XML 数据。
假定该应用程序以后希望提供新版本的 XML 架构,并且它选择目标命名空间 BOOK-V2。可以将此 XML 架构添加到 C 中。XML 列可以存储 BOOK-V1 和 BOOK-V2 的实例,并且可以对符合这些命名空间的 XML 实例执行查询和数据修改。
加载 XML 数据
将 XML 数据从 SQL Server 2000 传输到 SQL Server 2005
您可以采用多种方式将 XML 数据传输到 SQL Server 2005。例如:
如果将数据存储在 SQL Server 2000 数据库中的 [n]text 或 image 中,则可以使用 SQL Server Integration Services 将表导入 SQL Server 2005 数据库中。使用 ALTER TABLE 语句将列类型更改为 XML。
可以使用 bcp out 从 SQL Server 2000 大容量复制数据,然后使用 bcp in 将数据大容量插入 SQL Server 2005 数据库中。
如果将数据存储在 SQL Server 2000 数据库的关系列中,请创建具有 [n]text 列和(可选)用于行标识符的主键列的新表。使用客户端编程检索在服务器上通过 FOR XML 生成的 XML,并将其写入 [n]text 列。然后,使用上述方法将数据传输到 SQL Server 2005 数据库中。您可以选择将 XML 直接写入 SQL Server 2005 数据库中的 XML 列。
示例:将列类型更改为 XML
假定您希望将 R 表中的 [n]text 列或 image 列 XYZ 的类型更改为非类型化的 XML。以下语句执行此类型更改:
复制代码
ALTER TABLE R ALTER COLUMN XYZ XML
如果需要,可以通过指定 XML 架构集合将目标为类型化为 XML。
大容量加载 XML 数据
可以通过使用 SQL Server 的大容量加载功能(如 bcp)将 XML 数据大容量加载到服务器中。通过使用 OPENROWSET 可以将文件中的数据加载到 XML 列中。以下示例说明了这一点。
示例:从文件中加载 XML
此示例显示了如何在表 T 中插入行。从文件 C:/MyFile/xmlfile.xml 中将 XML 列的值作为 CLOB 加载,并为整数列提供了值 10。
复制代码
INSERT INTO TSELECT 10, xColFROM (SELECT * FROM OPENROWSET (BULK 'C:/MyFile/xmlfile.xml', SINGLE_CLOB) AS xCol) AS R(xCol)
文本编码
SQL Server 2005 以 Unicode (UTF-16) 存储 XML 数据。从服务器检索的 XML 数据均采用 UTF-16 编码。如果需要采用不同的编码,必须对检索到的数据执行所需的转换。有时,XML 数据可能采用不同的编码。如果是这样,加载数据时必须非常小心。例如:
如果文本 XML 采用 Unicode(UCS-2、UTF-16),可以将其赋给 XML 列、变量或参数,不会有任何问题。
如果由于源代码页的原因,编码不是 Unicode 而是隐式的,则数据库中的字符串代码页应与要加载的码位相同或与其兼容。如果需要,请使用 COLLATE。如果不存在这样的服务器代码页,则必须添加使用正确编码的显式 XML 声明。
若要使用显式编码,请使用 varbinary() 类型(它与代码页没有任何交互),或使用字符串类型的相应代码页。然后,将数据赋给 XML 列、变量或参数。
示例:显式指定编码
假定您有一个 XML 文档 vcdoc,它存储为没有显式 XML 声明的 varchar(max)。以下语句添加编码为“iso8859-1”的 XML 声明,将 XML 文档串联起来,将结果转换为 varbinary(max) 以便保留字节表示形式,最终将其转换为 XML。这样,XML 处理器就可以根据指定的编码“iso8859-1”分析数据,并为字符串值生成相应的 UTF-16 表示形式。
复制代码
SELECT CAST( CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX)) AS XML)
XQuery 和类型推理
Transact-SQL 中嵌入的 XQuery 语言支持查询 xml 数据类型。该语言正在由万维网联盟 (W3C) 开发,Microsoft 的所有主要数据库供应商都参与其中。它包含了 XPath 2.0 版作为导航语言。同时,还提供了针对 xml 数据类型的数据修改语言构造。有关 SQL Server 中支持的 XQuery 构造、函数和运算符的详细信息,请参阅针对 xml 数据类型的 XQuery 函数。