Criar instâncias de dados XML

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instâ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]varchar, [n]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, confira 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 trata o valor da cadeia de caracteres como um documento ou fragmento XML codificado em Unicode de dois bytes. 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 usa essa página de código para a codificação quando nenhuma codificação explícita é especificada no próprio XML. Quando uma instância XML tem uma BOM ou uma declaração de codificação, a BOM ou declaração precisa ser consistente com a página de código, caso contrário, o analisador relata 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 examina 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 é interpretada como UTF-8.

Quando a codificação do documento XML não é conhecida antecipadamente e os dados são passados como cadeia de caracteres ou dados binários em vez de dados XML antes da conversão em XML, trate 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

Quando um tipo de dado CLR definido pelo usuário tem uma serialização XML, as instâncias daquele tipo podem 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 é ignorado 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 quando não tem 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, confira CAST e CONVERT.

Por padrão, o analisador XML descarta espaço em branco insignificante quando converte dados de cadeia de caracteres em XML quando uma das seguintes opções é 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;

Veja a seguir o conjunto de resultados.

<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);

Quando o parâmetro style não é usado ou seu valor é definido como 0, o espaço em branco insignificante não é 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, confira CAST e CONVERT.

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 no exemplo de código 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 em consultas FOR XML 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;

Veja a seguir o conjunto de resultados.

<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, confira 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 do mecanismo de banco de dados do SQL Server. 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, quando você usa FOR XML sem a diretiva TYPE, os dados XML retornam 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. Essa atribuição é equivalente a 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, confira Comparar XML digitado com XML não digitado.

Usar carregamento em massa

A funcionalidade OPENROWSET 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, confira Exemplos de importação e exportação em massa de documentos XML (SQL Server). Para obter mais informações sobre carregamento de documentos XML, confira Carregar dados XML.

Nesta seção

Artigo Descrição
Opções de consultas XML e dados preservados Descreve as partes das instâncias XML que não são preservadas quando são armazenadas em bancos de dados.