Fala galera!!
Na quinta-feira (09/04), vi uma dúvida bem legal no grupo do Telegram SQL Server – DBA, o maior grupo de DBA’s e Desenvolvedores SQL Server do mundo, onde a pessoa tinha uma tabela no banco, onde uma coluna era do tipo XML, e ele gostaria de exportar para o disco, cada linha dessa tabela como um arquivo XML separado e achei que daria um artigo legal demonstrar essa solução.
Para exportar os dados da tabela para arquivos texto no disco, vou utilizar as soluções compartilhadas no artigo SQL Server – Como exportar dados do banco para arquivo texto (CLR, OLE, BCP).
Caso você tenha interesse em aprender melhor a manipular e tratar arquivos XML dentro do SQL Server, sugiro a leitura do artigo SQL Server – Como ler, importar e exportar dados de arquivos XML.
Para esse exemplo, vou utilizar o script abaixo para criar uma tabela de demonstração, simulando a tabela original do problema:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-- Criação da base de testes IF (OBJECT_ID('dbo.Dados') IS NOT NULL) DROP TABLE dbo.Dados CREATE TABLE dbo.Dados ( Nome VARCHAR(100), Cidade VARCHAR(100), Conteudo XML ) INSERT INTO dbo.Dados ( Nome, Cidade, Conteudo ) VALUES ('Dirceu Resende', 'Bridgetown','<Pessoa><Nome>Dirceu Resende</Nome><Conteudo>Teste</Conteudo></Pessoa>'), ('Lya', 'Vila Velha', '<Pessoa><Nome>Lya</Nome><Conteudo>Teste 1</Conteudo></Pessoa>'), ('Sula', 'Belo Hozionte', '<Pessoa><Nome>Sula</Nome><Conteudo>Teste 2</Conteudo></Pessoa>'), ('Letícia', 'Vitória', '<Pessoa><Nome>Lele</Nome><Conteudo>Teste 3</Conteudo></Pessoa>'), ('Rafael', 'Fortaleza', '<Pessoa><Nome>Rafa</Nome><Conteudo>Teste 4</Conteudo></Pessoa>'), ('Leandro', 'São Paulo', '<Pessoa><Nome>Mongo</Nome><Conteudo>Teste 5</Conteudo></Pessoa>'), ('Arthur', 'Brasília', '<Pessoa><Nome>iFan</Nome><Conteudo>Teste 6</Conteudo></Pessoa>'), ('Jhonathan', 'São Paulo', '<Pessoa><Nome>Jon</Nome><Conteudo>Teste 7</Conteudo></Pessoa>'); |
Como exportar o conteúdo de uma coluna para arquivos XML
Como parte da solução proposta para esse cenário, vou utilizar a Stored Procedure stpEscreve_Arquivo_FSO, disponível no artigo Operações com arquivos utilizando OLE Automation no SQL Server, para criar arquivos de texto com o conteúdo das colunas:
Clique para visualizar o código da Stored ProcedureApós criar essa Stored Procedure, crie o diretório de destino dos arquivos XML que serão gerados e execute o script abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
-- Cria uma tabela temporária rankeada IF (OBJECT_ID('tempdb..#Temporario_Ranking') IS NOT NULL) DROP TABLE #Temporario_Ranking SELECT *, ROW_NUMBER() OVER(ORDER BY Nome) AS Ranking INTO #Temporario_Ranking FROM dbo.Dados -- Cria o looping para iterar em casa linha da tabela, recuperar as informações e gravar os arquivos DECLARE @Contador INT = 1, -- Variável para iterar entre cada linha da linha @Total INT = (SELECT COUNT(*) FROM #Temporario_Ranking), -- Variável que vai guardar o total de linhas da tabela @Nome VARCHAR(100) -- Variável que vai guardar o valor da coluna "Nome" da linha atual da iteração @Conteudo VARCHAR(MAX) -- Variável que vai guardar o valor da coluna "Conteúdo" da linha atual da iteração, @Diretorio VARCHAR(500) = 'C:\Temporario\XML\', -- Diretório de destinos dos arquivos (deve ser criado previamente) @Nome_Arquivo VARCHAR(255) -- Nome do arquivo que será criado na iteração atual WHILE (@Contador <= @Total) BEGIN -- Recupera as informações a partir da linha atual SELECT @Nome = Nome, @Conteudo = CONVERT(VARCHAR(MAX), Conteudo), @Nome_Arquivo = @Diretorio + Nome + '.xml' FROM #Temporario_Ranking WHERE Ranking = @Contador -- Executa a Stored Procedure para criar o arquivo XML com o conteúdo recuperado na instrução anterior EXEC dbo.stpEscreve_Arquivo_FSO @String = @Conteudo, -- varchar(max) @Ds_Arquivo = @Nome_Arquivo -- varchar(1501) -- Incrementa o contador de iterações SET @Contador += 1 END |
Após a execução do script abaixo, realizando os ajustes necessários para o seu cenário, o diretório de destino deverá ter sido populado com conteúdo da coluna do tipo XML, sendo um arquivo para cada linha da tabela.
Espero que tenham gostado dessa dica rápida e bem útil no dia a dia, especialmente de quem está começando.
Um grande abraço e até a próxima!
Prezados, boa tarde!
A dúvida do Gilson Msg 50000, Level 16, State 1, Procedure stpEscreve_Arquivo_FSO, Line 107… Alguém tem alguma saída contorno?
Muito obrigada Dirceu Resende, Vc é verdadeiro contribuinte de conhecimentos.
Me ajudou muito SQL Server – Como exportar o conteúdo de uma coluna para arquivos XML.
Que ótimo trabalho, obrigado, estou tendando adaptar o script para uma necessidade aqui na empresa, mas ele só exporta os primeiros 256 arquivos xml, o último é gravado vazio, depois disso a query continua mas nenhum arquivo mais é gravado. Uma mensagem de erro é mostrada: Msg 50000, Level 16, State 1, Procedure stpEscreve_Arquivo_FSO, Line 107
Error whilst opening the File System Object,. Já tentei outras pastas, verifiquei permissões, etc, não consegui sair disso, pode me dar uma dica?
como faria para a saída do arquivo estar no formato UTF8 SEM BOM?
muito massa parabéns