Como gerar um arquivo .txt a partir do sql server 2008

23/11/2011

0

Pessoal, boa noite,

Estou com uma grande dificuldade de encontrar algum material que me oriente na geração de um arquivo .txt, de um determinado layout, que possui posições de inicio e fim de cada campo da tabela, exemplo: campo CNPJ inicio coluna 10 fim coluna 24, total de 14 caracteres, usando comando sql, ou seja, querys.

Alguém possui algum material que possa me enviar ?
Caso não, alguém poderia me dar os primeiros passos para eu gerar este arquivo ?

Segue meu email = paulojabqueiroz@yahoo.com.br

Grande abraço a todos,

Paulo Queiroz
Paulo Queiroz

Paulo Queiroz

Responder

Post mais votado

23/11/2011

Paulo,

Segue um exemplo:

alter procedure sp_escrevenoarquivo (@Caminho SYSNAME, @TXT VARCHAR(8000) )
as

begin

DECLARE @FSO INT, @RES int, @FID int

EXECUTE @RES = sp_OACreate Scripting.FileSystemObject, @FSO OUT

-- Abertura do Arquivo
EXECUTE @RES = sp_OAMethod @FSO, OpenTextFile, @FID OUT, @Caminho, 8, 1

-- Escrita para o arquivo
EXECUTE @RES = sp_OAMethod @FID, WriteLine, Null, @TXT
EXECUTE @RES = sp_OAMethod @FID, close, Null
EXECUTE @RES = sp_OADestroy @FID
EXECUTE @RES = sp_OADestroy @FSO
end


EXEC SP_EscreveNoArquivo C:\Testes.txt , Essa é a primeira linha do arquivo


Existe também a possibilidade de gerar o arquivo via comando BCP ou CMDSHELL

exemplo:
declare @Cmd varchar(255)
set @Cmd = sqlcmd -Urm -Prm -dCorporeRMOficial -q select chapa,nome from pfunc -o c:\funcionario.txt
exec master..xp_cmdshell @Cmd

Marco Pinheiro

Marco Pinheiro
Responder

Mais Posts

24/11/2011

Paulo Queiroz

Marco,

Muito obrigado pelo apoio.

Só uma pergunta, com esse código, que ainda não analisei, eu consigo posicionar cada coluna em um determinado tamanho no arquivo .txt, exemplo:

campo CNPJ da tabela fornecedor possui tamanho 14, ou seja, ele deverá entrar no arquivo .txt da coluna 10 até a 24, ou seja, posicionando na coluna como se fosse a geração de um layout, entende ?

aguardo seu retorno.

Grande abraço,

Paulo Queiroz
Responder

24/11/2011

Marco Pinheiro

Olá Paulo,

Tem sim. Esse exemplo que te mandei é justamente o que precisei fazer para layout bancário. Montei uma query especificando o tamanho das posições e depois só gerei em arquivo.

Tudo vai depender exclusivamente da sua query.

Att.,

Marco.
Responder

24/11/2011

Paulo Queiroz

Marco,

Mais uma vez, agradeço seu retorno.

o que to tendo dificuldade na geração da query é exatamente isso, ou seja, posicionar cada campo em um tamanho de comprimento do layout, ou seja, o campo razão social, ele deve ir da coluna 20 até a 70, ou seja 50 caracteres.
Acontece que quando o campo possui um nome MENOR QUE 50, o próximo campo do layout junta com essa campo, ou seja, tipo concatena.

Por favor Marco, tem como você me enviar parte de sua query que você tratou o posicionamento das colunas ?

Lhe agradeço,

meu email = paulojabqueiroz@yahoo.com.br

Lhe agradeço,

Paulo Queiroz
Responder

24/11/2011

Marco Pinheiro

Paulo,

Use a função do SQL REPLICATE.

Veja o exemplo:

--Campo do layout precisa ter 50 posições, porém fisica no banco ele tem 25.

SELECT CAMPO + REPLICATE( , 50 - LEN(CAMPO)) FROM TABELA

É necessário o uso do LEN pois você não sabe quantos caracteres existem na coluna. Então vc faz essa conta para complementar a string desejada.

Veja se consegue agilizar algo com isso.

Att.,

Marco.
Responder

24/11/2011

Paulo Queiroz

Marco,

mais uma vez lhe agradeço pelo apoio e digo que com o uso do replicate consigo
alinhar as colunas. Agora acontece o seguinte, veja o código como ficou:

SELECT TRC
+ SPACE(5) + SPACE(2) + CLI_PESS + CAST(CLI_CGC AS VARCHAR(14)) COLLATE Latin1_General_CI_AS
+ CAST(CLI_RAZA AS VARCHAR(60)) + REPLICATE( ,60 - LEN(CLI_RAZA))
+ CAST(CLI_APELIDO AS VARCHAR(20)) + REPLICATE( ,19 - (LEN(CLI_APELIDO)))
+ LTRIM(CLI_FEND) + REPLICATE( ,60 - LEN(CLI_FEND))
FROM CPACLIE

Alinhei o layout baseado no reultado do select para o primeiro item, ou seja, fornecedor cod=1.
Apos gerar para todos, os demais resultados, ficaram desalinhados a partir da coluna CLI_FEND,
OU SEJA, ENDERE;CO DO FORNECEDOR.

Mesmo usando LTRIM, não consegui trazer a coluna do CLI_FEND PARA O LOCAL CORRETO, QUE SERIA A
COLUNA 116.

MEU AMIGO, COMO FAÇO PARA RESOLVER ESSA SITUAÇÃO ? PARA QUE TODAS AS COLUJAS FIQUEM ALINHADAS NOS
DEMAIS REGISTROS ?

GRANDE ABRAÇO,

PAULO QUEIROZ
Responder

25/11/2011

Marco Pinheiro

Paulo,

Poste um exemplo de como está e como quer que fique, por favor.

Att.,

Marco.
Responder

25/11/2011

Paulo Queiroz

Marco, bom dia.

Lhe agradeço o empenho no apoio a minha empreitada.
Consegui alinhar os campos usando o comando REPLICATE.
Acontece que eu tava usando um espaço entre aspas simples, , de 1 carácter, dessa forma como tá.
Não sei que tratamento o sql tava fazendo, pois dessa forma ele não alinhava.
Quando usei aspas simples, juntas, ou seja, sem espaços, ele alinhou perfeitamente as colunas.
Exemplo:

ANTES COM DESALINHAMENTO = CAST(CLI_RAZA AS VARCHAR(60)) + REPLICATE( ,60 - LEN(CLI_RAZA))
DEPOIS ALINHADO = CAST(CLI_RAZA AS VARCHAR(60)) + REPLICATE(,60 - LEN(CLI_RAZA))

Agradeço seu apoio,

Se pintar alguma novidade eu alinho contigo.

Um grande abraço,

Paulo Queiroz
Responder

25/03/2015

Wygor Raimundo

E ai galera,

Se puderem me ajudar na questão abaixo, é sobre o assunto abordado nesta página...
Tenho a select abaixo, e gostaria de exportar os dados da consulta automaticamente em uma determinada hora do dia para um arquivo .txt, e salvar no caminho c:\nomeArquivo.txt. Seguindo o que vocês conversaram, não consegui fazer...

Podem me ajudar?

Select
o.Numero,
o.valor[Valor Unit],
o.quant[Qtd],
o.total[Total],
o.desconto[Desc],
p.codigo[Cod Prod],
s.Descricao,
p.referencia[Ref],
c.Codigo[Cod Cor],
n.codigo[Cod Grade]
from Orcamento o

inner join ItemProduto as ip on o.codprod = ip.barras
inner join Produtos as p on ip.codprod = p.codigo
inner join Secao as s on p.Secao = s.Codigo
inner join Cor as c on ip.codcor = c.Codigo
inner join Numeracao as n on ip.CodGrade = n.codigo
Responder

25/03/2015

Marcos P

Você precisa efetuar a geração do TXT via BCP...

Dê uma olhada em :

https://social.msdn.microsoft.com/Forums/pt-BR/de2a15ea-42b4-463f-bbbb-3bee2b9187bf/exportar-um-select-para-txt?forum=transactsqlpt

http://forum.imasters.com.br/topic/408771-resolvidoexportar-para-txt-via-query/

Depois de funcionando a geração do TXT, você programa o job via Sql Server Agent...
Responder

25/03/2015

Wygor Raimundo

Já consultei estes links e não deu certo gerar o arquivo...
Vou tentar novamente, obrig.
Responder

25/03/2015

Marcos P

Qual erro vc obteve ?

Qual a versão do Sql Server você está utilizando ?
Responder

25/03/2015

Marcos P

No link abaixo, você obtém vários exemplos do BCP para a última versão do Sql Server...

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

Testei alguns e eles funcionam... destaco a recomendação contida na página : "O exemplo presume que você esteja usando autenticação do Windows e tenha uma conexão confiável com a instância do servidor na qual está executando o comando bcp."

Boa sorte !
Responder

25/03/2015

Wygor Raimundo

Marcos, utilizo o SQL Server 2008 R2, Wind 7.

exec xp_cmdshell 'BCP "select * from Orcamento " queryout c:\teste.TXT -c -t[;] -r{#}\n -CP850 -T -Slocalhost'
Consegue identificar algo de errado no comando acima?

A resposta que tenho do SQL quando executo diretamente no SQL, aparece uma coluna chamada output com as informações:

- SQLState = S0002, NativeError = 208
- Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name 'Orcamento'.
- SQLState = 37000, NativeError = 8180
- Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement(s) could not be prepared.
Responder

25/03/2015

Wygor Raimundo

Marcos, utilizo o SQL Server 2008 R2, Wind 7.

exec xp_cmdshell 'BCP "select * from Orcamento " queryout c:\teste.TXT -c -t[;] -r{#}\n -CP850 -T -Slocalhost'
Consegue identificar algo de errado no comando acima?

A resposta que tenho do SQL quando executo diretamente no SQL, aparece uma coluna chamada output com as informações:

- SQLState = S0002, NativeError = 208
- Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name 'Orcamento'.
- SQLState = 37000, NativeError = 8180
- Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement(s) could not be prepared.
Responder

25/03/2015

Wygor Raimundo

Marcos, utilizo o SQL Server 2008 R2, Wind 7.

exec xp_cmdshell 'BCP "select * from Orcamento " queryout c:\teste.TXT -c -t[;] -r{#}\n -CP850 -T -Slocalhost'
Consegue identificar algo de errado no comando acima?

A resposta que tenho do SQL quando executo diretamente no SQL, aparece uma coluna chamada output com as informações:

- SQLState = S0002, NativeError = 208
- Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Invalid object name 'Orcamento'.
- SQLState = 37000, NativeError = 8180
- Error = [Microsoft][SQL Server Native Client 10.0][SQL Server]Statement(s) could not be prepared.
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar