Recuperando dados XML

O SQL Server preserva o conteúdo da instância XML, mas não preserva aspectos da instância XML que não são considerados significativos no modelo de dados XML. Isso significa que uma instância XML recuperada pode não ser idêntica à instância que foi armazenada no servidor, mas conterá as mesmas informações.

Este tópico descreve as partes de instâncias XML que não são preservadas quando são armazenadas em bancos de dados.

Declaração XML

A declaração XML em uma instância não é preservada quando a instância é armazenada no banco de dados. Por exemplo:

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

O resultado é <doc/>.

A declaração XML, como <?xml version='1.0'?>, não é preservada ao armazenar dados XML em uma instância de tipo de dados xml. Isso ocorre por design. A declaração XML (<? xml... ?>) e seus atributos (versão/codificação/autônoma) são perdidos depois que os dados são convertidos no tipo xml. A declaração XML é tratada como uma diretiva para o analisador XML. Os dados XML são armazenados internamente como ucs-2. Todos os outros PIs na instância XML são preservados.

Ordem dos atributos

A ordem dos atributos em uma instância XML não é preservada. Quando você consulta a instância XML armazenada na coluna de tipo xml, a ordem dos atributos no XML resultante pode ser diferente da instância XML original.

Aspas em torno de valores de atributos

Aspas simples e aspas duplas em torno de valores de atributos não são preservadas. Os valores de atributos são armazenados no banco de dados como um nome e par de valores. As aspas não são armazenadas. Quando uma XQuery é executada em uma instância XML, o XML resultante é serializado com aspas duplas em torno dos valores dos atributos.

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

As duas consultas retornam = <root a="1" />.

Prefixos de namespace

Prefixos de namespace não são preservados. Quando você especifica XQuery em uma coluna de tipo xml, o resultado de XML serializado pode retornar prefixos de namespace diferentes.

DECLARE @x xml
SET @x = '<ns1:root xmlns:ns1="abc" xmlns:ns2="abc">
            <ns2:SomeElement/>
          </ns1:root>'
SELECT @x
SELECT @x.query('/*')
GO

O prefixo de namespace no resultado pode ser diferente. Por exemplo:

<p1:root xmlns:p1="abc"><p1:SomeElement/></p1:root>

Consulte também

Conceitos