Carregar dados XML

Aplica-se a:SQL ServerBanco de Dados SQL do Azure

Você pode transferir dados XML ao SQL Server de várias maneiras. Por exemplo:

  • Se tiver seus dados em uma coluna [n]text ou uma imagem em um banco de dados SQL Server, poderá importar a tabela usando o Integration Services. Altere o tipo da coluna para XML usando a instrução ALTER TABLE.

  • Você pode copiar em massa os dados de outro banco de dados SQL Server usando bcp out e, em seguida, inserir em massa os dados no banco de dados da versão posterior usando bcp in.

  • Se você tiver dados em colunas relacionais em um banco de dados SQL Server, crie uma nova tabela com uma coluna [n]text e, opcionalmente, uma coluna de chave primária para um identificador de linha. Use programação do lado do cliente para recuperar o XML gerado no servidor com FOR XML e gravá-la na coluna [n]text . Em seguida, use as técnicas mencionadas anteriormente para transferir dados para um banco de dados de versão posterior. É possível optar por gravar diretamente o XML em uma coluna XML no banco de dados da versão posterior.

Carregar dados XML em massa

Você pode carregar dados XML em massa no servidor usando os recursos de carregamento em massa do SQL Server, como bcp. O OPENROWSET permite carregar dados de arquivos em uma coluna de XML. O exemplo a seguir ilustra esse ponto.

Exemplo: carregar XML de arquivos

Este exemplo mostra como inserir uma linha na tabela T. O valor da coluna XML é carregado do arquivo C:\MyFile\xmlfile.xml como CLOB, e a coluna de inteiro recebe o valor 10.

INSERT INTO T
SELECT 10, xCol
FROM    (SELECT *
    FROM OPENROWSET (BULK 'C:\MyFile\xmlfile.xml', SINGLE_BLOB)
AS xCol) AS R(xCol);

Codificação de texto

O SQL Server armazena dados XML em Unicode (UTF-16). Os dados XML recuperados do servidor são fornecidos em codificação UTF-16. Para obter uma codificação diferente, você precisa executar a conversão necessária nos dados recuperados. Às vezes, os dados XML podem estar em uma codificação diferente. Nesse caso, você precisará ter cuidado durante o carregamento dos dados. Por exemplo:

  • Se o texto XML estiver em Unicode (UCS-2, UTF-16), você poderá atribuí-lo a uma coluna, variável ou parâmetro XML sem nenhum problema.

  • Se a codificação não for Unicode e estiver implícita, devido à página de código-fonte, a página de código da cadeia de caracteres no banco de dados deverá ser a mesma ou deverá ser compatível com os pontos de código que você deseja carregar. Se necessário, use COLLATE. Se não houver nenhuma página de código desse tipo, será necessário adicionar uma declaração XML explícita com a codificação correta.

  • Para usar uma codificação explícita, use o tipo varbinary() , que não tem nenhuma interação com páginas de código. ou use um tipo de cadeia de caracteres da página de código apropriada. Em seguida, atribua os dados a uma coluna, variável ou parâmetro XML.

Exemplo: especificar explicitamente uma codificação

Suponha que você tenha um documento XML, vcdoc, armazenado como varchar(max) que não tenha uma declaração XML explícita. A instrução a seguir adiciona uma declaração XML com a codificação “iso8859-1”, concatena o documento XML, converte o resultado em varbinary(max) de forma que a representação de bytes seja preservada e, finalmente, converte-o em XML. Isso permite que o processador XML analise os dados de acordo com a codificação "iso8859-1" especificada e gere a representação UTF-16 correspondente para valores de cadeias de caracteres.

SELECT CAST(
CAST (('<?xml version="1.0" encoding="iso8859-1"?>'+ vcdoc) AS VARBINARY (MAX))
AS XML);

Incompatibilidades de codificação de cadeia de caracteres

Se você copiar e colar o XML como um literal de cadeia de caracteres na janela Editor de Consultas do SQL Server Management Studio, poderá ocorrer incompatibilidade de codificação de cadeia de caracteres [n]varchar. Isso dependerá da codificação de sua instância XML. Em muitas casos, você poderá desejar remover a declaração XML. Por exemplo:

<?xml version="1.0" encoding="UTF-8"?>
  <xsd:schema ...

Em seguida, você deve prefixar a cadeia de caracteres com N para tornar a instância XML uma instância de Unicode. Por exemplo:

-- Assign XML instance to a variable.
DECLARE @X XML
SET @X = N'...'
-- Insert XML instance into an xml type column.
INSERT INTO T VALUES (N'...')
-- Create an XML schema collection
CREATE XML SCHEMA COLLECTION XMLCOLL1 AS N'<xsd:schema ... '

Confira também