Partilhar via


Carregar dados XML

Aplica-se a:SQL ServerAzure SQL DatabaseBase de dados SQL no Microsoft Fabric

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

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

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

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

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. OPENROWSET permite que você carregue dados em uma coluna XML a partir de arquivos. 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 inteira é fornecida 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 saem na codificação UTF-16. Se você quiser uma codificação diferente, você tem que executar a conversão necessária nos dados recuperados. Às vezes, os dados XML podem estar em uma codificação diferente. Caso seja o caso, é necessário ter cuidado durante o carregamento de dados. Por exemplo:

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

  • 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 de cadeia de caracteres no banco de dados deverá ser igual ou compatível com os pontos de código que você deseja carregar. Se necessário, utilize COLLATE. Se essa página de código do servidor não existir, 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 interage com code pages, ou utilize um tipo de string da code page 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 para varbinary(max) para que a representação de bytes seja preservada e, finalmente, a converte em XML. Isso permite que o processador XML analise os dados de acordo com a codificação especificada "iso8859-1" e gere a representação UTF-16 correspondente para valores de cadeia 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 XML como um literal de cadeia de caracteres na janela do Editor de Consultas no SQL Server Management Studio, poderá enfrentar incompatibilidades de codificação de cadeia de caracteres [n]varchar. Isso dependerá da codificação da sua instância XML. Em muitos casos, convém 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 um 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 ... '

Ver também