Criar instâncias de dados XML

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Este artigo descreve como gerar instâncias XML.

No SQL Server, você pode gerar instâncias XML das seguintes maneiras:

  • Instâncias de cadeia de caracteres de conversão de tipos.

  • Usando a instrução SELECT com a cláusula FOR XML.

  • Usando atribuições de constantes.

  • Usando carregamento em massa.

Conversão de tipos de cadeia de caracteres e instâncias binárias

Você pode analisar qualquer um dos tipos de dados de cadeia de caracteres do SQL Server, como [n][var]char, [n]text, varbinary e image, no tipo de dados xml transformando (CAST) ou convertendo (CONVERT) a cadeia de caracteres para o tipo de dados xml. O XML não tipado é verificado para confirmar que está bem formado. Se houver um esquema associado ao tipo xml, a validação também será executada. Para obter mais informações, consulte Comparar XML digitado com XML não digitado.

Documentos de XML podem ser codificados com diferentes codificações (por exemplo, UTF-8, UTF-16, Windows-1252). O seguinte descreve as regras de como os tipos de origem de cadeia de caracteres e binários interagem com a codificação do documento XML e como o analisador se comporta.

Como nvarchar pressupõe uma codificação Unicode de dois bytes, como UTF-16 ou UCS-2, o analisador XML tratará o valor da cadeia de caracteres como um documento ou fragmento XML codificado em Unicode de dois bytes. Isso indica que o documento XML precisa ser codificado em uma codificação Unicode bem como ser compatível com o tipo de dados da origem Um documento XML codificado em UTF-16 pode ter uma marca de ordem de byte (BOM) UTF-16, mas isso não é necessário, pois o contexto do tipo de origem deixa claro que ele só pode ser um documento codificado em Unicode de dois bytes.

O conteúdo de uma cadeia de caracteres varchar é tratado como um documento/fragmento XML codificado em um byte pelo analisador XML. Como a cadeia de caracteres de origem varchar tem uma página de código associada, o analisador usará essa página de código para a codificação, se nenhuma codificação explícita for especificada no próprio XML. Se uma instância XML tiver uma BOM ou uma declaração de codificação, a BOM ou declaração precisará ser consistente com a página de código, caso contrário o analisador relatará um erro.

O conteúdo de varbinary é tratado como um fluxo de codepoint que é passado diretamente ao analisador XML. Assim, o documento ou fragmento XML precisa fornecer a BOM ou outras informações embutidas de codificação. O analisador examinará o fluxo apenas para determinar a codificação. Isso significa que XML codificado em UTF-16 precisa fornecer a BOM de UTF-16 e que uma instância sem BOM e sem uma codificação de declaração será interpretada como UTF-8.

Se a codificação do documento XML não for conhecida antecipadamente e os dados forem passados como cadeia de caracteres ou dados binários em vez de dados XML antes da conversão em XML, é recomendável tratar esses dados como varbinary. Por exemplo, ao ler dados de um arquivo XML usando OpenRowset(), deve-se especificar os dados a serem lidos como um valor varbinary(max):

SELECT CAST(x AS XML);
FROM OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x);

O SQL Server representa XML internamente em uma representação binária eficiente que usa codificação UTF-16. A codificação fornecida pelo usuário não é preservada, mas é considerada durante o processo de análise.

Tipos de dados CLR definidos pelo usuário para conversão de tipo

Se um tipo de dado CLR definido pelo usuário tiver uma serialização XML, as instâncias daquele tipo poderão ser convertidas explicitamente em um tipo de dados XML. Para obter mais informações sobre a serialização de XML de um tipo de dado CLR definido pelo usuário, consulte Serialização de XML de objetos de banco de dados CLR.

Lidar com espaço em branco no XML tipado

No SQL Server, o espaço em branco dentro do conteúdo do elemento é considerado insignificante quando ocorre dentro de uma sequência de dados de caracteres somente com espaço em branco delimitados por markup, como marcas de início ou fim, e não tiver uma entidade definida. (Seções de CDATA são ignoradas.) Esse tratamento de espaço em branco é diferente de como o espaço em branco é descrito na especificação do XML 1.0 publicada pelo World Wide Web Consortium (W3C). Isso ocorre porque o analisador XML do SQL Server reconhece apenas um número limitado de subconjuntos de DTD, conforme definido em XML 1.0. Para obter mais informações sobre os subconjuntos de DTD limitados que têm suporte no SQL Server, consulte CAST e CONVERT (Transact-SQL).

Por padrão, o analisador XML descarta espaço em branco insignificante quando converte dados de cadeia de caracteres em XML se uma das seguintes situações for verdadeira:

  • O atributo xml:space não está definido em um elemento ou em seus elementos ancestrais.

  • O atributo xml:space em efeito em um elemento ou em um de seus elementos ancestrais tem o valor de padrão.

Por exemplo:

DECLARE @x XML;
SET @x = '<root>      <child/>     </root>';
SELECT @x;

Este é o resultado:

<root><child/></root>

Porém, é possível alterar esse comportamento. Para preservar espaço em branco para uma instância DT XML, use o operador CONVERT e seu parâmetro opcional style definido como um valor de 1. Por exemplo:

SELECT CONVERT(xml, N'<root>      <child/>     </root>', 1);

Se o parâmetro style não for usado ou seu valor for definido como 0, o espaço em branco insignificante não será preservado na conversão da instância xml DT. Para obter mais informações sobre como usar o operador CONVERT e seu parâmetro style ao converter dados de cadeia de caracteres em instâncias DT xml, consulte CAST e CONVERT (Transact-SQL).

Exemplo: Converter um valor de cadeia de caracteres em XML tipado e atribuí-lo a uma coluna

O exemplo a seguir converte uma variável de cadeia de caracteres que contém um fragmento XML para o tipo de dados xml e, em seguida, armazena-a na coluna de tipo xml :

CREATE TABLE T(c1 int primary key, c2 xml);
GO
DECLARE  @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';

A operação de inserção a seguir converte implicitamente de uma cadeia de caracteres em tipo xml :

INSERT INTO T VALUES (3, @s);

Você pode cast() a cadeia de caracteres explicitamente para o tipo xml:

INSERT INTO T VALUES (3, CAST(@s AS XML));

Ou é possível usar convert(), conforme mostrado a seguir:

INSERT INTO T VALUES (3, CONVERT(XML, @s));

Exemplo: converter uma cadeia de caracteres em XML tipado e atribui-la a uma variável

No exemplo a seguir, uma cadeia de caracteres é convertida em tipo xml e atribuída a uma variável de tipo de dados xml :

DECLARE @x XML;
DECLARE  @s VARCHAR(100);
SET @s = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
SET @x = CONVERT(XML, @s);
SELECT @x;

Usar a instrução SELECT com uma cláusula FOR XML

É possível usar a cláusula FOR XML em uma instrução SELECT para retornar resultados como XML. Por exemplo:

DECLARE @xmlDoc XML;
SET @xmlDoc = (SELECT Column1, Column2
               FROM   Table1, Table2
               WHERE  <some condition>
               FOR XML AUTO)
...;

A instrução SELECT retorna um fragmento XML textual que, em seguida, é analisado durante a atribuição à variável de tipo de dados xml .

Também é possível usar a diretiva TYPE na cláusula FOR XML que retorna um resultado da consulta FOR XML diretamente como tipo xml :

DECLARE @xmlDoc XML;
SET @xmlDoc = (SELECT ProductModelID, Name
               FROM   Production.ProductModel
               WHERE  ProductModelID = 19
               FOR XML AUTO, TYPE);
SELECT @xmlDoc;

Este é o resultado:

<Production.ProductModel ProductModelID="19" Name="Mountain-100" />...

No exemplo a seguir, o resultado xml com tipo de uma consulta FOR XML é inserido em uma coluna de tipo xml:

CREATE TABLE T1 (c1 int, c2 xml);
GO
INSERT T1(c1, c2)
SELECT 1, (SELECT ProductModelID, Name
           FROM Production.ProductModel
           WHERE ProductModelID = 19
           FOR XML AUTO, TYPE);
SELECT * FROM T1;
GO

Para obter mais informações sobre FOR XML, consulte FOR XML (SQL Server).

Observação

O SQL Server retorna instâncias de tipo de dados xml ao cliente como um resultado das diferentes construções do servidor como consultas FOR XML que usam a diretiva TYPE ou em que o tipo de dados xml é usado para retornar XML de colunas, variáveis e parâmetros de saída SQL. No código do aplicativo cliente, o provedor ADO.NET solicita que essas informações de tipo de dados xml sejam enviadas em uma codificação binária do servidor. Porém, se você estiver usando FOR XML sem a diretiva TYPE, os dados XML retornarão como um tipo de cadeia de caracteres. De qualquer forma, o provedor cliente sempre poderá controlar qualquer formulário de XML.

Usar atribuições de constantes

Uma constante de cadeia de caracteres pode ser usada onde uma instância do tipo de dados xml é esperada. Isso é o mesmo que uma CAST implícita de cadeia de caracteres em XML. Por exemplo:

DECLARE @xmlDoc XML;
SET @xmlDoc = '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>';
-- Or
SET @xmlDoc = N'<?xml version="1.0" encoding="ucs-2"?><doc/>';

O exemplo anterior converte implicitamente a cadeia de caracteres no tipo de dados xml e a atribui a uma variável de tipo xml .

O exemplo a seguir insere uma cadeia de caracteres constante em uma coluna de tipo xml :

CREATE TABLE T(c1 INT PRIMARY KEY, c2 XML);
INSERT INTO T VALUES (3, '<Cust><Fname>Andrew</Fname><Lname>Fuller</Lname></Cust>');

Observação

Para XML com tipo, o XML é validado em relação ao esquema especificado. Para obter mais informações, consulte Comparar XML digitado com XML não digitado.

Usar carregamento em massa

A funcionalidade OPENROWSET (Transact-SQL) aprimorada permite carregar documentos XML em massa no banco de dados. É possível carregar instâncias XML em massa de arquivos em colunas de tipo xml no banco de dados. Para obter exemplos de funcionamento, consulte Exemplos de importação e exportação em massa de documentos XML (SQL Server). Para obter mais informações sobre carregamento de documentos XML, consulte Carregar dados XML.

Nesta seção

Artigo Descrição
Recuperar e consultar dados XML Descreve as partes das instâncias XML que não são preservadas quando são armazenadas em bancos de dados.

Confira também