none
Exportar tabela Sql para xml RRS feed

  • Pergunta

  • Boa tarde,

    Preciso exportar minha tabela do sql para o formato xml, vi que tem como fazer isso pelo método BCP, mas além de exportar, preciso fazer um job de exportação, então não sei se dá pra fazer usando BCP, qual é a melhor forma de fazer isso?

    sábado, 30 de maio de 2015 16:31

Respostas

  • DaniloVRoque,

    Se o usuário que você possui permissão para utilizar os recursos do utilitário BCP, então você poderá utilizar ele mesmo no seu Job adicionando o comando para ser executado através da stored procedure de sistema "xp_cmdshell".

    Segue abaixo um script T-SQL para você adaptar à sua necessidade:

    DECLARE @cmd varchar(255);
    
    SELECT @cmd = ' BCP "select * from [SeuBanco].dbo.SuaTabela LINHA for xml auto, root(''TESTEXML''), elements" ' + 
    'queryout "c:\arquivo.xml" -S SeuServidor\SuaInstanciaSQL -T -w -r -t';
    
    EXEC xp_cmdshell @cmd; 
    GO

    Segue abaixo o print-screen como evidência deste teste:

    O resultado será um arquivo XML, semelhante à imagem abaixo:

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms162802.aspx

    https://msdn.microsoft.com/pt-br/library/ms178107.aspx

    http://blogs.msdn.com/b/saurabh_singh/archive/2010/05/11/export-sql-table-records-to-xml-form.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 1 de junho de 2015 12:49

Todas as Respostas

  • DaniloVRoque,

    Se o usuário que você possui permissão para utilizar os recursos do utilitário BCP, então você poderá utilizar ele mesmo no seu Job adicionando o comando para ser executado através da stored procedure de sistema "xp_cmdshell".

    Segue abaixo um script T-SQL para você adaptar à sua necessidade:

    DECLARE @cmd varchar(255);
    
    SELECT @cmd = ' BCP "select * from [SeuBanco].dbo.SuaTabela LINHA for xml auto, root(''TESTEXML''), elements" ' + 
    'queryout "c:\arquivo.xml" -S SeuServidor\SuaInstanciaSQL -T -w -r -t';
    
    EXEC xp_cmdshell @cmd; 
    GO

    Segue abaixo o print-screen como evidência deste teste:

    O resultado será um arquivo XML, semelhante à imagem abaixo:

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms162802.aspx

    https://msdn.microsoft.com/pt-br/library/ms178107.aspx

    http://blogs.msdn.com/b/saurabh_singh/archive/2010/05/11/export-sql-table-records-to-xml-form.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 1 de junho de 2015 12:49
  • Obrigado! Consegui fazer aqui. Só mais uma dúvida, tem algum jeito em que eu consiga salvar o nome do arquivo que eu queira e ao lado a data atual? Obrigado.
    segunda-feira, 1 de junho de 2015 18:11
  • Obrigado! Consegui fazer aqui. Só mais uma dúvida, tem algum jeito em que eu consiga salvar o nome do arquivo que eu queira e ao lado a data atual? Obrigado.

    DaniloVRoque,

    Para formatar o nome do arquivo basta concatenar o formato desejado à string.

    Segue um exemplo em T-SQL com o formato "yyyyMMAA hhmmssMMM":

    DECLARE @cmd varchar(255);
    
    DECLARE @nome varchar(20) = REPLACE(REPLACE(REPLACE(CONVERT(varchar, GETDATE(), 126), '-',''), ':',''), '.','');
    
    SELECT @cmd = ' BCP "select * from [SeuBanco].dbo.SuaTabela LINHA for xml auto, root(''TESTEXML''), elements" ' + 
    'queryout "c:\arquivo' + @nome +'.xml" -S SeuServidor\SuaInstanciaSQL -T -w -r -t';


    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms187928.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    segunda-feira, 1 de junho de 2015 18:22
  • DaniloVRoque,

    Se o usuário que você possui permissão para utilizar os recursos do utilitário BCP, então você poderá utilizar ele mesmo no seu Job adicionando o comando para ser executado através da stored procedure de sistema "xp_cmdshell".

    Segue abaixo um script T-SQL para você adaptar à sua necessidade:

    DECLARE @cmd varchar(255);
    
    SELECT @cmd = ' BCP "select * from [SeuBanco].dbo.SuaTabela LINHA for xml auto, root(''TESTEXML''), elements" ' + 
    'queryout "c:\arquivo.xml" -S SeuServidor\SuaInstanciaSQL -T -w -r -t';
    
    EXEC xp_cmdshell @cmd; 
    GO

    Segue abaixo o print-screen como evidência deste teste:

    O resultado será um arquivo XML, semelhante à imagem abaixo:

    Para maiores informações veja:

    https://msdn.microsoft.com/pt-br/library/ms162802.aspx

    https://msdn.microsoft.com/pt-br/library/ms178107.aspx

    http://blogs.msdn.com/b/saurabh_singh/archive/2010/05/11/export-sql-table-records-to-xml-form.aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    Durval,

    Gostei da sua sugestão, mas gostaria de fazer uma consideração.

    Eu particularmente não indicaria o uso da XP_CMDShell, o que poderia ser feito é criar um Job e configurar o step para rodar em modo shell informando o valor de CMDExec na opção @SubSytem. Com certeza, você deve saber que existem alguns cenário que a XP_CMDShell pode representar uma ameaçada para o SQL Server.

    Talvez este exemplo pode ajudar:

    Create PROCEDURE dbo.usp_ExecCmdShellProcess
    AS  
        BEGIN 
            DECLARE @job NVARCHAR(100), @BulkCMD Varchar(1000)
            SET @job = 'xp_cmdshell replacement'+Convert(Varchar(10),GetDate()) ;  
    
    		SET @BulkCMD = 'BULK INSERT ListFiles FROM '+'''C:\TEMP\LISTFILES.TXT'' '+
    		'WITH (FIELDTERMINATOR = '';'', ROWTERMINATOR = '''+ CHAR(10) +''', CODEPAGE = ''ACP'')'
    
            EXEC msdb..sp_add_job @job_name = @job, 
                @description = 'Automated job to execute command shell script', 
                @owner_login_name = 'pedro', @delete_level = 1 ;  
    
            EXEC msdb..sp_add_jobstep @job_name = @job, @step_id = 1, 
                @step_name = 'Command Shell Execution', @subsystem = 'CMDEXEC', 
                @command ='dir /b > C:\TEMP\LISTFILES.TXT', @on_success_action = 1;
    
            EXEC msdb..sp_add_jobserver @job_name = @job ;  
    
            EXEC msdb..sp_start_job @job_name = @job ;
    
            Exec(@Bulkcmd)
    						
        END ; 
    GO 
    


    Pedro Antonio Galvao Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 4 de junho de 2015 23:45
    Moderador