none
Gerar txt sem usar BCP RRS feed

  • Pergunta

  • Pessoal bom dia, preciso gerar um arquivo txt, de uma tabela temporária, com faço isso sem ser via bcp.

    Estou dentro de uma procedure e o resultado dela irei transformar em tabela temporaria, e quero gerar dessa tabela um arquivo txt.

    terça-feira, 4 de novembro de 2014 10:07

Respostas

  • Bom dia,

    Mesmo sabendo que não quer utilizar o BCP, segue abaixo o exemplo de como faço.

    				SELECT @V_COMANDO  = REPLACE(REPLACE(' BCP "SELECT DISTINCT ' + @V_CAMPOSEXPORTACAO + ' FROM ' + @V_DBNAME + @TABELA + ' A ' + @M_FILTROEXPEXT + '"  QUERYOUT ' + @M_DIRETORIOEXPEXT + @M_ARQUIVOEXPEXT + ' /S '+ '.' + ' /m0 /b100 /c /t /U ' + user + ' /r \n /P ' + senha + ' > NUL ',CHAR(13), ' '), CHAR(10), ' ')
    		
    				SELECT @V_COMANDO
    			
    				CREATE TABLE #RETORNOERRO 
    				(
    					DESCRICAO VARCHAR(4000)
    				);
    			
    				/* AQUI É ONDE GERA O ARQUIVO .TXT */
    				INSERT INTO #RETORNOERRO EXEC ( 'master..xp_cmdshell ''' +  @V_COMANDO + '''');			
    
    				SELECT @V_ERRO = COUNT(*) FROM #RETORNOERRO
    				WHERE DESCRICAO IS NOT NULL
    
    				IF @V_ERRO > 0 
    				BEGIN
    					--faz insert em uma tabela de log
    				END

    Utilizo isso em ambientes de produção e nunca tive nenhum problema.


    Atenciosamente, Ruberlei. www.t-sql.com.br

        Ruberlei bom dia, obrigado pela dica,

    agora o meu erro é pq não tenho acesso para executar o object 'xp_cmdshell'

    " The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'. "

    vou ver oq faço aqui pq talvez ñ consiga essa liberação

    terça-feira, 4 de novembro de 2014 11:22

Todas as Respostas

  • Bom dia,

    Existe algum motivo específico de não querer utilizar o BCP, pois utilizo o mesmo e nunca tive problemas.

    No aguardo.


    Atenciosamente, Ruberlei. www.t-sql.com.br

    terça-feira, 4 de novembro de 2014 10:16
  • Ruberlei bom dia, sempre deu errado, ai queria fazer de outra forma que tambem funciona


    terça-feira, 4 de novembro de 2014 10:34
  • Bom dia,

    Mesmo sabendo que não quer utilizar o BCP, segue abaixo o exemplo de como faço.

    				SELECT @V_COMANDO  = REPLACE(REPLACE(' BCP "SELECT DISTINCT ' + @V_CAMPOSEXPORTACAO + ' FROM ' + @V_DBNAME + @TABELA + ' A ' + @M_FILTROEXPEXT + '"  QUERYOUT ' + @M_DIRETORIOEXPEXT + @M_ARQUIVOEXPEXT + ' /S '+ '.' + ' /m0 /b100 /c /t /U ' + user + ' /r \n /P ' + senha + ' > NUL ',CHAR(13), ' '), CHAR(10), ' ')
    		
    				SELECT @V_COMANDO
    			
    				CREATE TABLE #RETORNOERRO 
    				(
    					DESCRICAO VARCHAR(4000)
    				);
    			
    				/* AQUI É ONDE GERA O ARQUIVO .TXT */
    				INSERT INTO #RETORNOERRO EXEC ( 'master..xp_cmdshell ''' +  @V_COMANDO + '''');			
    
    				SELECT @V_ERRO = COUNT(*) FROM #RETORNOERRO
    				WHERE DESCRICAO IS NOT NULL
    
    				IF @V_ERRO > 0 
    				BEGIN
    					--faz insert em uma tabela de log
    				END

    Utilizo isso em ambientes de produção e nunca tive nenhum problema.


    Atenciosamente, Ruberlei. www.t-sql.com.br

    • Sugerido como Resposta Ruberlei terça-feira, 13 de janeiro de 2015 18:31
    terça-feira, 4 de novembro de 2014 10:42
  • Douglas,

    Além do BCP, você tem duas opções:

    - Se você está no SSMS, você pode direcionar o resultado da procedure (ou desta tabela temporária) para um arquivo usando a combinação de teclas (CTRL + SHIFT + T), ou;

    - Você pode utilizar o utilitário "sqlcmd" para extrair estes dados diretamente para um arquivo, através de linha de comando;

    Para maiores informações veja:

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

    http://technet.microsoft.com/pt-br/library/ms170572(v=sql.105).aspx

    http://technet.microsoft.com/pt-br/library/ms190144(v=sql.110).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    terça-feira, 4 de novembro de 2014 10:45
    Moderador
  • Bom dia,

    Mesmo sabendo que não quer utilizar o BCP, segue abaixo o exemplo de como faço.

    				SELECT @V_COMANDO  = REPLACE(REPLACE(' BCP "SELECT DISTINCT ' + @V_CAMPOSEXPORTACAO + ' FROM ' + @V_DBNAME + @TABELA + ' A ' + @M_FILTROEXPEXT + '"  QUERYOUT ' + @M_DIRETORIOEXPEXT + @M_ARQUIVOEXPEXT + ' /S '+ '.' + ' /m0 /b100 /c /t /U ' + user + ' /r \n /P ' + senha + ' > NUL ',CHAR(13), ' '), CHAR(10), ' ')
    		
    				SELECT @V_COMANDO
    			
    				CREATE TABLE #RETORNOERRO 
    				(
    					DESCRICAO VARCHAR(4000)
    				);
    			
    				/* AQUI É ONDE GERA O ARQUIVO .TXT */
    				INSERT INTO #RETORNOERRO EXEC ( 'master..xp_cmdshell ''' +  @V_COMANDO + '''');			
    
    				SELECT @V_ERRO = COUNT(*) FROM #RETORNOERRO
    				WHERE DESCRICAO IS NOT NULL
    
    				IF @V_ERRO > 0 
    				BEGIN
    					--faz insert em uma tabela de log
    				END

    Utilizo isso em ambientes de produção e nunca tive nenhum problema.


    Atenciosamente, Ruberlei. www.t-sql.com.br

        Ruberlei bom dia, obrigado pela dica,

    agora o meu erro é pq não tenho acesso para executar o object 'xp_cmdshell'

    " The EXECUTE permission was denied on the object 'xp_cmdshell', database 'mssqlsystemresource', schema 'sys'. "

    vou ver oq faço aqui pq talvez ñ consiga essa liberação

    terça-feira, 4 de novembro de 2014 11:22
  • Valeu Durval vou dar uma pesquisada aqui.
    terça-feira, 4 de novembro de 2014 11:23
  • Boa tarde Douglas.

    Crie um procedimento em VB ou C++.net como uma aplicação SQL Server e depois faça o deploy do DLL para dentro do SQL Server

    Esse procedimento é que devera gravar o arquivo na pasta especificada.

    Você passa a tabela temporária para a DLL e ela grava o arquivo.

    Você pode aprender mais sobre CLR em:

    http://www.mssqltips.com/sqlservertip/1662/writing-to-an-operating-system-file-using-the-sql-server-sqlclr/

    sexta-feira, 14 de novembro de 2014 18:58
  • Deleted
    sábado, 15 de novembro de 2014 18:52
  • Bom dia

    Jose.Diz
    20,095
    Pontos
    Principal 0.5
    Jose.Diz
    Ingressou Mar 2013

    2

    6

    16

    ,  gostei da sua proposta só que ao rodar seu script apareceu o seguinte erro 

    Msg 7308, Level 16, State 1, Line 2
    O provedor OLE DB 'Microsoft.Jet.OLEDB.4.0' não pode ser utilizado para consultas distribuídas porque está configurado para execução em modo STA.

    Vc sabe como resolver? 



    • Editado Fabricio.G segunda-feira, 17 de novembro de 2014 14:19
    segunda-feira, 17 de novembro de 2014 11:29
  • Deleted
    segunda-feira, 17 de novembro de 2014 16:02
  • Valeu Vou dar uma olhada... 

    Obrigado.

    terça-feira, 18 de novembro de 2014 11:34