Usuário com melhor resposta
Gerar txt sem usar BCP

Pergunta
-
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
- Marcado como Resposta Douglas a Fernandes terça-feira, 4 de novembro de 2014 15:25
Todas as 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
- Sugerido como Resposta Ruberlei terça-feira, 13 de janeiro de 2015 18:31
-
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" -
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
- Marcado como Resposta Douglas a Fernandes terça-feira, 4 de novembro de 2014 15:25
-
-
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:
-
-
Bom dia
, 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
-
-