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:
-- 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:
-- 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!

Comentários (0)
Carregando comentários…