xml 数据类型的限制
下列限制适用于 xml 数据类型:
不能用作 sql_variant 实例的子类型
不支持转换为 text 或 ntext。
不支持下面这些列和表约束:
- PRIMARY KEY/ FOREIGN KEY
- UNIQUE
- COLLATE
XML 提供了它自己的编码。排序规则只适用于字符串类型。xml 数据类型不是字符串类型。但是,它有字符串表示形式并允许与字符串数据类型之间的相互转换。 - RULE
不能进行比较或排序。这意味着 xml 数据类型不能用在 GROUP BY 语句中。
不能在分布式分区视图使用。
可以在具体化视图中创建。具体化视图不能基于 xml 数据类型方法。但可以转换为不同于基表中的 xml 类型列的 XML 架构集合。
不能用作除了 ISNULL、COALESCE 和 DATALENGTH 之外的任何内置标量函数的参数。
不能用作索引中的键列。但可以作为数据包含在聚集索引中;如果创建了非聚集索引,也可以使用 INCLUDE 关键字显式添加到该非聚集索引中。
如果实例存储在数据库中,将不保留该实例中的 XML 声明 PI。例如:
CREATE TABLE T1 (Col1 int primary key, Col2 xml) GO INSERT INTO T1 values (1, '<?xml version="1.0" encoding="windows-1252" ?><doc></doc>') GO SELECT Col2 FROM T1
结果为
<doc/>
。
在 xml 数据类型实例中存储 XML 数据时,将不保留 XML 声明 PI(例如 <?xml version='1.0'?>)。这是默认设置。XML 声明 (<?xml ...?>) 及其属性 (version/encoding/stand-alone) 在数据被转换为 xml 类型后将丢失。XML 声明被视为对 XML 分析器的指令。XML 数据将被内部存储为 ucs-2。将保留 XML 实例中的所有其他 PI。不保留 XML 实例中的属性顺序。查询存储在 xml 类型列中的 XML 实例时,所得 XML 中的属性顺序可能与原 XML 实例中的顺序不同。
默认情况下,不保留无关紧要的空格。例如:
DECLARE @x xml SET @x = '<root> <child/> </root>' SELECT @x
这将返回以下结果:
<root><child/></root>
不过,您可以更改此行为。若要保留 xml 数据类型实例中的空格,请使用 CONVERT 运算符并将其可选的 style 参数设置为 1。例如:
SELECT CONVERT(xml, N'<root> <child/> </root>', 1)
如果未使用 style 参数,或该参数的值设置为 0,则在 xml 数据类型实例的转换中将不保留无关紧要的空格。有关在将字符串数据转换为 xml 数据类型实例时如何使用 CONVERT 运算符及其 style 参数的详细信息,请参阅CAST 和 CONVERT (Transact-SQL)。
不保留属性值前后的单引号和双引号。属性值作为名称和值对存储在数据库中。不存储引号。对 XML 实例执行 XQuery 时,将用属性值前后的双引号对所得 XML 进行序列化。
DECLARE @x xml -- Use double quotation marks. SET @x = '<root a="1" />' SELECT @x GO DECLARE @x xml -- Use single quotation marks. SET @x = '<root a=''1'' />' SELECT @x GO
两个查询都返回
<root a="1" />
。不保留命名空间前缀。对 xml 类型列指定 XQuery 时,序列化的 XML 结果可能会返回不同的命名空间前缀。
DECLARE @x xml SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc"> <ns2:SomeElement/> </ns1:root>' SELECT @x SELECT @x.query('/*') GO
结果中的命名空间前缀可能会有所不同。例如:
<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>
如果将 XML 作为字符串文字复制并粘贴到 SQL Server Management Studio 中的查询编辑器窗口,可能会遇到 [N]VARCHAR 字符串编码不兼容的情况。这将取决于 XML 实例的编码。在很多情况下,您可能需要删除 XML 声明。例如:
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema …
然后,应包含 N 以使 XML 实例成为 Unicode 实例。例如:
-- Assign XML instance to a variable. DECLARE @X XML SET @X = N'? -- Insert XML instance into an xml type column. INSERT INTO T VALUES (N'?) -- Create an XML schema collection CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ?'
SQL Server 将把 xml 数据类型实例(例如使用 TYPE 指令或在其中使用 xml 数据类型从 SQL 列、变量和输出参数返回 XML 的 FOR XML 查询)作为不同服务器构造的结果返回到客户端。在客户端应用程序代码中,ADO.NET 访问接口请求以二进制编码形式从服务器发送此 xml 数据类型信息。但是,如果使用不带 TYPE 指令的 FOR XML,则 XML 数据将作为字符串类型返回。在任何情况下,客户端访问接口都始终能够处理其中任一种形式的 XML 内容。
请参阅
概念
示例 XML 应用程序
类型化与非类型化的 XML
生成 XML 实例
XML 数据修改语言 (XML DML)
xml 数据类型