none
Usando xp_cmdshell para criar arquivos com dados [RESOLVIDO] RRS feed

  • Pergunta

  • Bom dia Pessoal 

    Tenho hoje um proc, onde estou precisando pegar um campo de uma tabela que contem um xml nesse campo, e exportar o mesmo para arquivos, para depois poder utiliza-los, porém estou tentando fazer essa rotina que pegue os arquivos e vá cirando os arquivos em um diretorio X, e nao está fazendo nada, nem erro nem nada acontece, simplesmente nao cria os arquivos.

    Uso SQL Server 2008

    create procedure proc_exporta_xml_cte As
    begin
    	declare @cmd varchar(500)
    	declare @oid int
    	declare @xml varchar(5000)
    
    	create table ##tmp_exportas (
    			xml text default ''
    		);
    		
    	declare ret_xml cursor local for select top 1 OID, XML_CTE from dbo.homolog_cte_ndd
    	open ret_xml;
    
    	FETCH NEXT FROM ret_xml INTO @oid, @xml;
    
    	while (@@FETCH_STATUS = 0)
    	begin
    		insert into ##tmp_exportas (xml) values (@xml)
    		set @cmd = 'bcp "##tmp_exportas" out "C:\Exp_XML\xml' + CAST(@oid AS VARCHAR(5)) + '.xml" -S -c  -U "sa" -P "*****" -t; -T';
    		Exec master.sys.xp_cmdshell @cmd, 'no_output'; 
    		delete from ##tmp_exportas;
    
    		FETCH NEXT FROM ret_xml INTO @oid, @xml;
    	end
    	drop table ##tmp_exportas;
    end
    Obrigado!


    segunda-feira, 3 de dezembro de 2012 12:38

Respostas

  • Consegui resolver o meu problema com o xp_cmdshell, faltava a instancia do meu servidor:

    set @cmd = 'bcp "##tmp_exportas" out "C:\Exp_XML\xml' + CAST(@oid AS VARCHAR(5)) + '.xml" -S "CTEVIRTUAL\SQLCOOPERCTE" -c  -U "sa" -P "*****" -t; -T';


    Porém, eu estou tentando declarar um variavel tipo TEXT na minha procedure, pois o campo em questao do meu XML está com o tipo text, e quando passo para a minha variavel varchar, obviamente nao consegue atrituir todo o texto.

    De

    declare @xml varchar(5000)

    Para

    declare @xml text

    Mas acontece o seguinte erro:

    Mensagem 2739, Nível 16, Estado 1, Procedimento proc_exporta_xml_cte, Linha 2
    Os tipos de dados text, ntext e image são inválidos para variáveis locais.

    Como posso declarar um tipo que aceite o text e todo o seu conteudo?

    Obrigado!



    Trabalhe com VARCHAR(MAX) que por padrão consegue armazenar até 2GB de texto.
    segunda-feira, 3 de dezembro de 2012 16:07

Todas as Respostas

  • Você está utilizando o TOP 1 para alimentar o cursor, tem certeza que a campo XML_CTE para esta linha retornada está preenchido?

    segunda-feira, 3 de dezembro de 2012 13:16
  • Sim, estou usando o TOP 1 pq alem de ser uma base de homologação, estou fazendo para teste, nao precisa trazer todos os registros, e sim, está trazendo com dados esse campo.

    Não tem nada de errado com o select

    Tanto que fiz um teste 

    Exec master.sys.xp_cmdshell 'dir c:'

    e listou certinho o que eu tenho na minha pasta, so nao sei pq nao está escrevendo o arquivo lá.

    Alguma sugestão?

    segunda-feira, 3 de dezembro de 2012 13:19
  • Certo, então faça o seguinte:

    Substitua
    set @cmd = 'bcp "##tmp_exportas" out "C:\Exp_XML\xml' + CAST(@oid AS VARCHAR(5)) + '.xml" -S -c  -U "sa" -P "*****" -t; -T';

    por
    set @cmd = 'bcp "##tmp_exportas" out "C:\Exp_XML\xml' + CAST(@oid AS VARCHAR(5)) + '.xml" -S -c -t; -T'

    segunda-feira, 3 de dezembro de 2012 13:36
  • Consegui resolver o meu problema com o xp_cmdshell, faltava a instancia do meu servidor:

    set @cmd = 'bcp "##tmp_exportas" out "C:\Exp_XML\xml' + CAST(@oid AS VARCHAR(5)) + '.xml" -S "CTEVIRTUAL\SQLCOOPERCTE" -c  -U "sa" -P "*****" -t; -T';


    Porém, eu estou tentando declarar um variavel tipo TEXT na minha procedure, pois o campo em questao do meu XML está com o tipo text, e quando passo para a minha variavel varchar, obviamente nao consegue atrituir todo o texto.

    De

    declare @xml varchar(5000)

    Para

    declare @xml text

    Mas acontece o seguinte erro:

    Mensagem 2739, Nível 16, Estado 1, Procedimento proc_exporta_xml_cte, Linha 2
    Os tipos de dados text, ntext e image são inválidos para variáveis locais.

    Como posso declarar um tipo que aceite o text e todo o seu conteudo?

    Obrigado!


    segunda-feira, 3 de dezembro de 2012 16:03
  • Consegui resolver o meu problema com o xp_cmdshell, faltava a instancia do meu servidor:

    set @cmd = 'bcp "##tmp_exportas" out "C:\Exp_XML\xml' + CAST(@oid AS VARCHAR(5)) + '.xml" -S "CTEVIRTUAL\SQLCOOPERCTE" -c  -U "sa" -P "*****" -t; -T';


    Porém, eu estou tentando declarar um variavel tipo TEXT na minha procedure, pois o campo em questao do meu XML está com o tipo text, e quando passo para a minha variavel varchar, obviamente nao consegue atrituir todo o texto.

    De

    declare @xml varchar(5000)

    Para

    declare @xml text

    Mas acontece o seguinte erro:

    Mensagem 2739, Nível 16, Estado 1, Procedimento proc_exporta_xml_cte, Linha 2
    Os tipos de dados text, ntext e image são inválidos para variáveis locais.

    Como posso declarar um tipo que aceite o text e todo o seu conteudo?

    Obrigado!



    Trabalhe com VARCHAR(MAX) que por padrão consegue armazenar até 2GB de texto.
    segunda-feira, 3 de dezembro de 2012 16:07
  • Josivan,

    Concordo com a sugestão do Juliano, por padrão o tipo de dados Text não é reconhecido na declaração de variáveis locais em conjunto com o BCP.

    A sugestão mais indicado é utilizar a Varchar(max).


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    segunda-feira, 3 de dezembro de 2012 16:43
  • Exatamente, acabei pedindo e depois me lembrei desse tipo de dados.

    Obrigado pela ajuda!

    segunda-feira, 3 de dezembro de 2012 17:14