检索 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>

请参阅

概念