Usuário com melhor resposta
Ajuda BCP

Pergunta
-
SQLState = 08001, NativeError = 53 Error = [Microsoft][SQL Native Client]Named Pipes Provider: Could not open a connection to SQL Server [53]. SQLState = 08001, NativeError = 53 Error = [Microsoft][SQL Native Client]An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connecti ons. SQLState = S1T00, NativeError = 0 Error = [Microsoft][SQL Native Client]Login timeout expired NULL
Amigos,
Estou tentando importar uma consulta Oracle via OpenQuery. Mais nao estou consguindo.Declare @cmdSQL as Varchar(Max) Set @cmdSQL = 'Select Top 1 * From OPENQUERY(ICS,''''SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''''ACTIVE'''',''''OK'''')'''')' --Exec(@cmdSQL) Declare @bcp as Varchar(Max) Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL.txt" -S ICS -T -c -t"|"' --Select @bcp Declare @shell as Varchar(17) Set @shell = 'exec xp_cmdshell ' Declare @cmd as Varchar(Max) Set @cmd = @shell + '''' + @bcp + '''' --Select @cmd Exec(@cmd)
Erro:
Daniel
Respostas
-
Oi Daniel,
Tente assim:
Declare @bcp as Varchar(500) Set @bcp = 'bcp "select * from banco.dbo.rr" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ACCDBPRD01 -T -c -t"|"' exec xp_cmdshell @bcp
Substitua o "banco.dbo" pelo nome e esquema necessários
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível- Marcado como Resposta dralves terça-feira, 26 de maio de 2009 20:41
Todas as Respostas
-
DrAlves,
Como esta definida a configuração do Linked Server entre o Oracle e o SQL Server?
Em qual parte do código esta dando erro, desta forma, que você colocou o post fica dificil entender!!!!
Conceitualmente o código não esta incorreto!!!
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
O erro é esse:
SQLState = 08001, NativeError = 53
Error = [Microsoft][SQL Native Client]Named Pipes Provider: Could not open a connection to SQL Server [53].
SQLState = 08001, NativeError = 53
Error = [Microsoft][SQL Native Client]An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connecti
ons.
SQLState = S1T00, NativeError = 0
Error = [Microsoft][SQL Native Client]Login timeout expired
NULL
O linked Server funciona traquilamente. O Problema é quando tento executar utilizando o BCP. No final do BCP eu coloco novamente o LinkedServer "ICS". Será que eu devo colocar a senha novamente?
Daniel -
Boa Tarde,
Há algo errado. Se o Linked Server é para Oracle não faz sentido a mensagem de erro relatar uma falha de conexão com o SQL Server.
Verifique se o nome do Linked Server está correto e se ele aponta para o lugar correto.
Veja que seu comando de BCP tenta conectar no servidor ICS (o parâmetro -S). Se ICS é um servidor ORACLE o comando BCP não tem sentido. Se ICS é um servidor SQL, a descrição da dúvida não bate. No caso de ICS ser um servidor SQL Server recomendo verificar as conexões remotas (vide vários posts anteriores). Se ICS é um servidor ORACLE é preciso corrigir o comando. Sugiro:
Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL.txt" -S ' + @@ServerName + ' -T -c -t"|"'
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
O linked Server é para Oracle e está funcionando corretamente.
Gustavo, O comando ficou assim. Mais não está funcionando
Declare
@@ServerName as Varchar(50)
Set @@ServerName = 'ICS.RJ.TELEMAR'
Declare
@bcp as Varchar(Max)
Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL01.txt" -S ' + @@ServerName + ' -T -c -t"|"'
Erro:Msg 102, Level 15, State 1, Line 5
Incorrect syntax near '@@ServerName'.
Daniel -
DrAlves,
Você esta tentando atribuir valroes a uma variável de sistema @@ServerName isso não é permitido.
Faça algumas alterações no código:
Declare @ServerName as Varchar(50) Set @ServerName = 'ICS.RJ.TELEMAR' Declare @bcp as Varchar(Max) Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL01.txt" -S ' + @ServerName + ' -T -c -t"|"'
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
Olá Daniel,
Creio que você está interpretando mal o comando BCP. Mesmo que o código funcionasse, veja que o BCP não irá se conectar a um servidor ORACLE, pois, é uma aplicação SQL. Não adianta você setar o valor da variável @@servername para ICS.RJ.TELEMAR. Se você necessita de gerar um TXT a partir do ORACLE é melhor procurar as ferramentas do ORACLE diretamente. Não faz sentido usar um Linked Server para que o SQL Server conecte-se ao ORACLE puxe os dados e gere um arquivo texto. Isso é muito mais lento que utilizar uma ferramenta ORACLE para gerar o TXT diretamente.
Se realmente for utilizar essa abordagem, use o nome do servidor onde tem o Linked Server (no caso um servidor SQL) para rodar o BCP. Eu diria que se você deixar o seu código como está (supondo que a xp_cmdshell roda exatamente no servidor onde o Linked Server está configurado para o ORACLE) irá funcionar.
@@ServerName é uma variável global que retorna o nome do servidor local. Ela só pode ser lida (get) e não atribuída (set). Se há a necessidade de atribuir o valor, use uma variável local e não global.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
Ainda continuo com erro.
SQLState = 08001, NativeError = 53
Error = [Microsoft][SQL Native Client]Named Pipes Provider: Could not open a connection to SQL Server [53].
SQLState = 08001, NativeError = 53
Error = [Microsoft][SQL Native Client]An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connecti
ons.
SQLState = S1T00, NativeError = 0
Error = [Microsoft][SQL Native Client]Login timeout expired
NULL
Daniel -
Blz Gustavo,
o problema é que no Oracle eu não tenho permissão para fazer nada lá. Só consultar.
O erro agora é outro. Dá uma olhada.
SQLState = 37000, NativeError = 102 Error = [Microsoft][SQL Native Client][SQL Server]Incorrect syntax near 'ACTIVE'. SQLState = 37000, NativeError = 8180 Error = [Microsoft][SQL Native Client][SQL Server]Statement(s) could not be prepared. NULL
O código ficou dessa maneira. Porém quando eu tiro a condição Where funciona.exec xp_cmdshell 'bcp "Select Top 1 * From OPENQUERY(ICS,''SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''ACTIVE'',''OK'')'')" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL01.txt" -S ACCDBPRD01 -T -c -t"|"'
Poderia ajudar?
Daniel -
-
-
Ola Daniel
tente executar somente esta linha
exec
xp_cmdshell 'bcp "SELECT top 1 ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ics.ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''ACTIVE'',''OK'')" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL01.txt" -S ACCDBPRD01 -T -c -t"|"'
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
Marcelo não funcionou.
SQLState = S0002, NativeError = 208 Error = [Microsoft][SQL Native Client][SQL Server]Invalid object name 'ICS.ICSADM.ICS_E_ACTION_LAUNCHER'. SQLState = 37000, NativeError = 8180 Error = [Microsoft][SQL Native Client][SQL Server]Statement(s) could not be prepared. NULL
Daniel -
Daniel,
tenta agora com o char(39)
exec
xp_cmdshell 'bcp "Select Top 1 * From OPENQUERY(ICS,''SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN('+char(39)+'ACTIVE'+char(39)+','+char(39)+'OK'+char(39)+')'')" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Acao_ATUAL01.txt" -S ACCDBPRD01 -T -c -t"|"'
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
-
-
Olá Daniel,
O uso de ferramentas do Oracle não quer dizer que você tem que ter outras permissões além de leitura. Estou certo de que esse SGBD possui ferramentas para exportar para arquivos texto e que você não precisará ser um SysDBA para utilizá-las. É muito mais performático do que pedir ao SQL Server que leia os dados e gere um BCP.
Se isso realmente não for possível, certifique-se de que o comando de OPENROWSET (sem parâmetros) funciona. Depois trabalhamos a concatenação
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
-
Olá Daniel,
Desculpe. Não quis dizer OPENROWSET (embora também funcione). Faça um teste para ver se o OPENQUERY está funcionando.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
-
Ok,
Agora volte ao seu código anterior ao invés de rodar o xp_cmdshell, dê um PRINT na variável.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
-
Esse é o Print
exec xp_cmdshell 'bcp "Select Top 1 * From OPENQUERY(ICS,'SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN('ACTIVE','OK')')" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\Teste.txt" -S ACCDBPRD01 -T -c -t"|"
Daniel -
Olá Daniel,
Esse não é o PRINT, é o comando. Quero o PRINT do valor da variável @bcp antes de você executá-la com o shell.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
-
Olá Daniel,
Esse é o problema. O OPENQUERY espera um texto com o comando. Como o "Active" está entre duas aspas simples, o comando falha. Você precisa montá-lo para que ele fique da seguinte forma:
bcp "Select Top 1 * From OPENQUERY(ICS,'SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM
ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''ACTIVE'')')" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ICS -T -c -t"|"
É preciso dobrar as aspas do Active. Faça as tentativas e exiba a saída do comando até que esse comando fique correto
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
Dobrei de uma olhada:
bcp "Select Top 1 * From OPENQUERY(ICS,''SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''ACTIVE'')'')" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ICS -T -c -t"|"
Mais o erro apareceu quando tentei executar somente o BCP, vide código completo.
Declare @cmdSQL as Varchar(Max) Set @cmdSQL = 'Select Top 1 * From OPENQUERY(ICS,''''SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''''ACTIVE'''')'''')' --Select @cmdSQL --Exec(@cmdSQL) Declare @bcp as Varchar(Max) Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ICS -T -c -t"|"' Select @bcp Exec(@bcp)
Não esqueça que ainda falta o xp_cmdshell
Daniel -
DrAlves,
Será que este exemplo não ajuda:
Declare @LoteProducao Char(6), @CodProduto Char(3)
Set @LoteProducao='001268' Set @CodProduto='991'
Delete from Ct2006 Where LoteProducao=@LoteProducao AND SUBSTRING(CONVERT(CHAR(7),CODPRODUTO),1,3)=@CodProduto Go
Insert Into Ct2006 Select * from openquery([131.107.3.2], 'Select * from Ctluvas Where LoteProducao= ''002089'' AND SUBSTRING(CONVERT(CHAR(7),CODPRODUTO),1,3)=''991''')
Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA -
-
Boa Tarde,
Tinha uma aspas antes do SELECT e um após o parênteses. Tente agora.
Declare @cmdSQL as Varchar(Max) Set @cmdSQL = 'Select Top 1 * From OPENQUERY(ICS,''SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS IN(''''ACTIVE'''')'')' --Select @cmdSQL --Exec(@cmdSQL) Declare @bcp as Varchar(Max) Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ICS -T -c -t"|"' Select @bcp --Exec(@bcp)
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
Caraca tá sinistro. Desde já agradeço pela ajuda
Msg 103, Level 15, State 4, Line 1 The identifier that starts with 'Select Top 1 * From OPENQUERY(ICS,'SELECT ACCOUNT_ID, ACTION_ID, EXECUTION_DATE, STATUS FROM ICS_E_ACTION_LAUNCHER WHERE STATUS ' is too long. Maximum length is 128. Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'queryout'.
Daniel -
Olá Daniel,
Receio que esbarramos em uma limitação do BCP. Uma consulta só pode ter 128 caractéres e essa extrapolou esse tamanho. Sugiro o seguinte:
- Crie uma View
- Adicione o seu comando de OPENQUERY dentro da View
- Faça a consulta no BCP referenciando a View
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
-
Olá Daniel,
O comando de BCP deve ser rodado em um prompt ou via xp_cmdshell. Não é possível rodá-lo diretamente como uma consulta.
Vale a pena lembrar que você ainda está usando o parâmetro -S para o servidor ORACLE. Esse parâmetro está incorreto (conforme explicado nos posts anteriores). Você deve informar o servidor SQL que possui o Linked Server e não o servidor ORACLE
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
Tamo chegando lá.
Ficou assim já com as alterações do servidor SQL e a inclusão do xp_cmdshell
Declare @cmdSQL as Varchar(Max) Set @cmdSQL = 'Select * From rr' --Select @cmdSQL --Exec(@cmdSQL) Declare @bcp as Varchar(Max) Set @bcp = 'bcp "'+@cmdSQL+'" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ACCDBPRD01 -T -c -t"|"' Select @bcp Exec(@bcp) Declare @shell as Varchar(17) Set @shell = 'exec xp_cmdshell ' Declare @cmd as Varchar(Max) Set @cmd = @shell + '''' + @bcp + '''' --Select @cmd Exec(@cmd)
Erro:
Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'queryout'.
Erro:
SQLState = S0002, NativeError = 208 Error = [Microsoft][SQL Native Client][SQL Server]Invalid object name 'rr'. SQLState = 37000, NativeError = 8180 Error = [Microsoft][SQL Native Client][SQL Server]Statement(s) could not be prepared. NULL
Daniel -
Olá Daniel,
O uso do BCP é feito com o Prompt e não via query. Se a view é fixa também não há necessidade de concatená-la. Tente o seguinte:
Declare @bcp as Varchar(500) Set @bcp = 'bcp "select * from rr" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ACCDBPRD01 -T -c -t"|"' exec xp_cmdshell @bcp
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível -
Executei o script e o erro foi esse:
SQLState = S0002, NativeError = 208 Error = [Microsoft][SQL Native Client][SQL Server]Invalid object name 'rr'. SQLState = 37000, NativeError = 8180 Error = [Microsoft][SQL Native Client][SQL Server]Statement(s) could not be prepared. NULL
Daniel -
Oi Daniel,
Tente assim:
Declare @bcp as Varchar(500) Set @bcp = 'bcp "select * from banco.dbo.rr" queryout "\\10.20.88.200\FIXA_PA_PI_RN_SE\TESTE.txt" -S ACCDBPRD01 -T -c -t"|"' exec xp_cmdshell @bcp
Substitua o "banco.dbo" pelo nome e esquema necessários
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Como executar tarefas ao iniciar o SQL Server ?
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!570.entry
Classifique as respostas. O seu feedback é imprescindível- Marcado como Resposta dralves terça-feira, 26 de maio de 2009 20:41
-