Usuário com melhor resposta
Usando xp_cmdshell para criar arquivos com dados [RESOLVIDO]

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!
- Editado Josivan Laskoski segunda-feira, 3 de dezembro de 2012 17:15
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.- Editado _Juliano_Alves_ segunda-feira, 3 de dezembro de 2012 16:08
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 3 de dezembro de 2012 17:29
- Marcado como Resposta Ricardo Russo quarta-feira, 2 de janeiro de 2013 13:24
Todas as Respostas
-
-
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?
-
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'
-
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!
- Editado Josivan Laskoski segunda-feira, 3 de dezembro de 2012 16:04 a
-
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.- Editado _Juliano_Alves_ segunda-feira, 3 de dezembro de 2012 16:08
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 3 de dezembro de 2012 17:29
- Marcado como Resposta Ricardo Russo quarta-feira, 2 de janeiro de 2013 13:24
-
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]
- Sugerido como Resposta Junior Galvão - MVPMVP segunda-feira, 3 de dezembro de 2012 17:29
-