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 (     Name VARCHAR(100),     Cidade VARCHAR(100),     Conteudo XML ) INSERT INTO dbo.Dados (     Name,     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 Name) 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     @Name 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         @Name = Name,         @Conteudo = CONVERT(VARCHAR(MAX), Conteudo),         @Nome_Arquivo = @Diretorio + Name + '.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!


 
																								 
																								 Portuguese
 Portuguese                 English
 English                            
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