Array
(
    [0] => stdClass Object
        (
            [Votos_Balanceados] => 2
            [id] => 409688
            [titulo] => Como gerar um arquivo .txt a partir do sql server 2008
            [dataCadastro] => DateTime Object
                (
                    [date] => 2011-11-23 17:57:49
                    [timezone_type] => 3
                    [timezone] => America/Sao_Paulo
                )

            [isFirstPost] => -1
            [idUsuario] => 190389
            [status] => A
            [isExample] => 
            [NomeUsuario] => MARCO ANTÔNIO DOS SANTOS PINHEIRO
            [Apelido] => Marco Pinheiro
            [Foto] => Imagem 001-8.jpg
            [Conteudo] => 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
) )

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

Paulo Queiroz
   - 23 nov 2011

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

Post mais votado

Marco Pinheiro
   - 23 nov 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

Paulo Queiroz
   - 24 nov 2011

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

Marco Pinheiro
   - 24 nov 2011

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.

Paulo Queiroz
   - 24 nov 2011

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

Marco Pinheiro
   - 24 nov 2011

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.

Paulo Queiroz
   - 24 nov 2011

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

Marco Pinheiro
   - 25 nov 2011

Paulo,

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

Att.,

Marco.

Paulo Queiroz
   - 25 nov 2011

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

Eduardo Felicio
|
MVP
    25 mar 2015

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

Marcos P
   - 25 mar 2015

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...

Eduardo Felicio
|
MVP
    25 mar 2015

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

Marcos P
   - 25 mar 2015

Qual erro vc obteve ?

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

Marcos P
   - 25 mar 2015

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 !

Eduardo Felicio
|
MVP
    25 mar 2015

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.

Eduardo Felicio
|
MVP
    25 mar 2015

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.

Eduardo Felicio
|
MVP
    25 mar 2015


Citação:
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.

Marcos P
   - 25 mar 2015

"Orcamento" não é um uma tabela válida nesse contexto...

Você está no BD correto ?

A query funciona fora do BCP ?

Você está rodando no console do server ou em outra máquina ?

Você logou via autenticação do Windows ?

O usuário logado tem permissão de escrita na pasta de saída ?

Você conseguiu efetuar algum teste com os exemplos do link da MIcrosoft, que coloquei acima ?
https://msdn.microsoft.com/pt-br/library/aa337544.aspx

Eduardo Felicio
|
MVP
    25 mar 2015

Estou executando no banco correto.
A query funciona apenas no SQL Server.
Estou logado via autenticação do Windows.
Não sei como definir as permissões...

Vou tentar aprender com alguns colegas, pois por estes links eu nunca fiz algo nada do tipo e está meio confuso.
Obrigado pelo apoio Marcos.

Marcos P
   - 25 mar 2015

Testei em um Sql Server 2000, também...

Clique na imagem para abrir em uma nova janela

Repare como existe a referência completa ao banco e tabela de origem ( dbExemplo..cliente ), mesmo estando com ele ativo...

Acho que foi esse o seu problema quando gerou o erro... " Invalid object name 'Orcamento' " !

Eduardo Felicio
|
MVP
    13 mai 2015

Marco deu tudo certo. Esqueci de vir aqui postar a minha resposta...
E ainda consegui fazer no Sql Server e também em MySql.

Se alguém precisar de ajuda, podem me add no skype: marlon.portaldeideias

Pedro César
   - 27 out 2016

Boa tarde, Paulo!
quando executo o metodo para abertura do arquivo tenho retorno do erro -2146828218.
Você poderia me ajudar.

Obrigado