Criar procedure que crie um arquivo txt

4,339 views
Skip to first unread message

Pedro Victor

unread,
Apr 26, 2011, 4:23:18 PM4/26/11
to DotNet Brasil
Boa tarde pessoal,

Gostaria de saber se alguem ja criou uma procedure dentro do sql
server que ao ser executada cria um arquivo txt com o resultado da
pesquisa. Agradeço antecipadamente qualquer ajuda.

Saudações,

Pedro

Andre Luiz Gutierrez Filho

unread,
Apr 26, 2011, 5:26:56 PM4/26/11
to dotn...@googlegroups.com
Fiquei curioso com a questão do Pedro, afinal nunca precisei realizar essa operação.

Pesquisei na net sobre o assunto e encontrei o exemplo abaixo.

Espero que ajude.

Att,

André Gutierrez


-- Bloco responsável por criar e executar o comando que deverá criar
-- um arquivo txt com os dados da tabela sysobjects.
declare @cmd varchar(1000)
select @cmd = 'osql -E -S -Q "select * from master..sysobjects" -o "c:\osqloutput.txt" -w500'
exec master..xp_cmdshell @cmd


-- Em caso de erro de permissão, esse bloco deverá permitir a execução do xp_cmdshell
Exec Master.dbo.Sp_Configure 'Show Advanced Options', 1
Reconfigure
Exec Master.dbo.Sp_Configure 'XP_CmdShell', 1
Reconfigure


--
==============================
Comunidade de desenvolvedores Dot Net no Brasil

WebSite: www.dotnetbr.com

E-mail do Grupo: dotn...@googlegroups.com
==============================

Juan Lopes

unread,
Apr 26, 2011, 7:53:42 PM4/26/11
to dotn...@googlegroups.com
xp_cmdshell? Não prefere instalar um virus no PC de uma vez?

2011/4/26 Andre Luiz Gutierrez Filho <andregu...@gmail.com>

Renan Henrique

unread,
Apr 26, 2011, 8:33:24 PM4/26/11
to dotn...@googlegroups.com
Também pesquisei, o que encontrei foi referente a isso mesmo.

O que não acho legal do banco de dados fazer...

Felipe Oriani

unread,
Apr 26, 2011, 10:20:04 PM4/26/11
to dotn...@googlegroups.com
Por que tem que ser via stored procedure ?
via código é muito mais simples e elegante!


2011/4/26 Renan Henrique <rena...@gmail.com>



--
______________________________________
Felipe B. Oriani - 

"...Trabalhe quanto puder, tornando-se útil quanto possível..." , por André Luiz

Emmanuel G. Brandão

unread,
Apr 26, 2011, 11:19:35 PM4/26/11
to dotn...@googlegroups.com
Usa código .Net na proc ou melhor faça via VBScript, PowerShell, ... Mas direto em proc, qual o motivo?

Brandão, Emmanuel G.
@egomesbrandao
blog.egomesbrandao.net

___________________________________
Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Apague também os endereços dos amigos que receberam juntamente com você a mensagem, antes de enviar;
3 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.


2011/4/26 Felipe Oriani <fbor...@gmail.com>

Daniel Moreira Yokoyama

unread,
Apr 27, 2011, 8:16:57 AM4/27/11
to dotn...@googlegroups.com
Eu tenho uma teoria de que é assim que se cria um Banco de Dados Tableless: Procs escrevendo arquivos textos.

Atenciosamente,

Daniel Moreira Yokoyama.
@dmyoko
 
Blogs:
Getting Sharper (C#, Arquitetura de Software e outras coisas mais)
http://gettingsharper.wordpress.com/
 
Eis o Cristo... e jaz o Cristão (Cristianismo sem Religiosidade)
 


Stay Sharp!

Marcus Alexandre Silva

unread,
Apr 27, 2011, 8:26:53 AM4/27/11
to dotn...@googlegroups.com
Cada arquitetura deve ser observada por quem a utiliza. Se o cara precisa escrever arquivos textos baseados em uma procedure cabe a nós apenas indicar como fazer ao invés de criticar.
Pode parecer feio, mas quem tomou a decisão em se utilizar este recurso deve ter uma razão forte para tal.

Pedro, lhe recomendo esta leitura:

Tome cuidado com o que você esta fazendo, o que lhe parece bom hoje pode tornar uma tortura para quem for utilizá-lo amanhã.

Marcus Alexandre

Renan Henrique

unread,
Apr 27, 2011, 8:33:38 AM4/27/11
to dotn...@googlegroups.com

Concordo e discordo.

 

Se todos nós fossemos ninja em arquitetura, então ok, cada um deve observar a sua.

Mas como não somos, as vezes aprendemos de forma errada e se ninguém nos alertar, vamos continuar fazendo de forma errada.

Marcus Alexandre Silva

unread,
Apr 27, 2011, 8:44:58 AM4/27/11
to dotn...@googlegroups.com
Excelente ponto Renan,

Mas atente que arquitetura deve ser concebida a partir de um cenário. Não é baseado em uma unica funcionalidade que da para discutir se uma coisa é boa ou é ruim, a unica coisa que se pode ter certeza é do Depende em todas as respostas. Mas este não é um grupo de arquitetura, é um grupo de código (creio eu.)

De qualquer maneira se atente a meu ultimo post, onde peço o Pedro para tomar cuidado com o que ele esta querendo implementar, mesmo assim não deixei de lhe indicar algo para fazer o que ele quer (acho). E se a funcionalidade existe é porque provavelmente ela será boa para algum cenário.

Marcus Alexandre

daniel carli

unread,
Apr 27, 2011, 9:16:25 AM4/27/11
to dotn...@googlegroups.com
porque você não escreve um procedure utilizando codigo .net, acho que será bem mais fácil criar o txt por lá

Rubem Almeida

unread,
Apr 28, 2011, 12:06:12 PM4/28/11
to DotNet Brasil
Boa tarde jovem,

Não sei serve para o seu caso, mas para um aplicativo utilizando banco
de dados access que eu precisava fazer uma consulta e exportar o
resultado eu trabalhei da seguinte forma:

string ArquivoTXT = AppDomain.CurrentDomain.BaseDirectory +
"NomeDoArquivo.txt";

while OleDbDataReader.Read
item[0] = dataReader[0];
using (StreamWriter sw = File.CreateText(ArquivoTXT))
foreach
sw.WriteLine(item[0]);

Lógico que não foi exatamente assim que eu usei mas foi utilizando a
mesma idéia.
Bem, caso eu tenha escrito besteira ignore, pois estou ,digamos,
iniciando meus estudos em .net, ou se quiser complementar, melhorar,..
fica a vontade para compartilhar.

Bem, é isso.

Rubem Almeida

Pedro Victor

unread,
Apr 28, 2011, 6:53:22 PM4/28/11
to DotNet Brasil
Gostaria de agradecer a todos que dispuseram parte de seu tempo para
poder me ajudar com este problema. Consegui realiza de outra forma,
através da utilização de um conjunto de cursores sql.

http://msdn.microsoft.com/pt-br/library/ms180169.aspx



Andre Luiz Gutierrez Filho

unread,
Apr 26, 2011, 10:34:13 PM4/26/11
to dotn...@googlegroups.com
Realmente Renan,  não é legal mesmo.

No meu entendimento não é responsabilidade da base realizar esse tipo de operação.



Definição da procedure.

"Gera um shell de comando do Windows e passa em uma cadeia de caracteres para execução. Qualquer saída é retornada como linhas de texto."

Pedro Reys

unread,
Apr 28, 2011, 11:41:58 PM4/28/11
to dotn...@googlegroups.com
bcp.exe é seu amigo.

- Pedro Reys



2011/4/26 Pedro Victor <pedro_...@yahoo.com.br>

Fábio Morikawa

unread,
Apr 29, 2011, 8:52:41 AM4/29/11
to dotn...@googlegroups.com
Bom, a dúvida é bastante simples: como gerar arquivo texto por uma procedure.
Segue abaixo um exemplo que utilizo bastate.
Você tb pode cria uma dll em .net para gerar arquivo e registrar um assembly desta dll no sql server e chamar a funcao de dentro da proc, enfim. (procure por "CLR t-sql")

Aproveitando a oportunidade da thread se é bom ou não gerar arquivos de dentro do sql, acho mais vantagem do que desvantagem.
Suponhamos um cenário onde sua aplicação eh totalmente web e vc precise gerar 30mil xml (apenas um exemplo, mas meu caso real).
como faço? clico no botão e meu código fica executando? timeout na certa!. tenho um job que gera estes arquivos de tempos em tempos parametrizável de 500 em 500 por exemplo para não ocasionar uma lentidão do servidor ou por causa de IO ou consumo de memória ou processamento, etc. É claro que é um caso e existem outras formas de fazer como um windows services por exemplo.
Estou apenas acrescentando um cenário talvez não pensado pelo pessoal aqui.

Fica minha opinião e sugestão de código ao Pedro.

abs

declare
      @id_file_sist        int
    ,@id_arqv        int
    ,@status        int
    ,@src            varchar(255)
    ,@desc            varchar(255)

    --cria objeto
    exec @status        = sp_OACreate
                 'Scripting.FileSystemObject'
                ,@id_file_sist    OUTPUT


    if @status <> 0 or @@error <> 0
    begin
   
        exec sp_OAGetErrorInfo
             @id_file_sist
            ,@src    OUT
            ,@desc    OUT
           
        select     Source        = @src
            ,Description    = @desc

        goto erro
    end


    -- Abrir arquivo
    exec @status        = sp_OAMethod
                 @id_file_sist
                ,'OpenTextFile'
                ,@id_arqv    OUT
                ,'\\maquinaX\temp\teste.txt'    -- lembre-se: o codigo está sendo executado no sevidor
                                        -- portanto o caminho deve ser uma pasta compartilhada por exemplo
                ,2        -- 1: ForReading 2: ForWriting, 8: ForAppending
                ,1        -- indica se arquivo deve ser criado caso não exista: 0=false; 1=true.

    if @status <> 0 or @@error <> 0
    begin
   
        exec sp_OAGetErrorInfo
             @id_file_sist
            ,@src    OUT
            ,@desc    OUT
           
        select     Source        = @src
            ,Description    = @desc

        goto erro
    end

    -- Grava o xml no arquivo de saida
    exec @status        = sp_OAMethod
                 @id_arqv
                ,'WriteLine'
                ,Null
                ,'aqui vai o texto do arquivo'

    if @status <> 0 or @@error <> 0
    begin
   
        exec sp_OAGetErrorInfo
             @id_file_sist
            ,@src    OUT
            ,@desc    OUT
           
        select     Source        = @src
            ,Description    = @desc

        goto erro
    end


    -- Libera o arquivo
    exec @status        = sp_OADestroy
                @id_arqv

    if @status <> 0 or @@error <> 0
    begin
   
        exec sp_OAGetErrorInfo
             @id_file_sist
            ,@src    OUT
            ,@desc    OUT
           
        select     Source        = @src
            ,Description    = @desc

        goto erro
    end

    -- Libera o FileSystem
    exec @status        = sp_OADestroy
                @id_file_sist

    if @status <> 0 or @@error <> 0
    begin
   
        exec sp_OAGetErrorInfo
             @id_file_sist
            ,@src    OUT
            ,@desc    OUT
           
        select     Source        = @src
            ,Description    = @desc

        goto erro
    end
   
    goto fim
   
erro:
    print 'Error'
fim:
    print 'arquivo criado'


2011/4/29 Pedro Reys <pedr...@gmail.com>
Reply all
Reply to author
Forward
0 new messages