检索 XML 数据
SQL Server 可保留 XML 实例的内容,但不会保留 XML 数据模型中认为是不重要的 XML 实例的某些方面。这意味着检索到的 XML 实例可能与服务器中存储的实例不相同,但将包含同样的信息。
本主题介绍当 XML 实例存储在数据库中时不会保留的部分。
XML 声明
当将某个实例存储在数据库中时,不会保留该实例中的 XML 声明。例如:
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 声明(如 <?xml version='1.0'?>)。这是默认设置。XML 声明 (<?xml ...?>) 及其属性 (version/encoding/stand-alone) 在数据被转换为 xml 类型后将丢失。XML 声明被视为对 XML 分析器的指令。XML 数据在内部存储为 ucs-2。XML 实例中所有其他 PI 均被保留。
属性的顺序
不保留 XML 实例中的属性顺序。查询存储在 xml 类型列中的 XML 实例时,所得 XML 中的属性顺序可能与原 XML 实例中的顺序不同。
属性值前后的引号
不保留属性值前后的单引号和双引号。属性值作为名称和值对存储在数据库中。不存储引号。对 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>