Não é possível despejo de dados da tabela para o arquivo usando o BCP quando chamado a partir do JDBC
-
25-09-2019 - |
Pergunta
Eu escrevi um procedimento de despejo de dados de uma tabela para um arquivo de texto assim (suponha que as variáveis relevantes foram declarados);
SET @sql = '"SELECT * FROM ##OutputData"'
SET @cmdline = 'bcp '+ @sql +' queryout '+@OutputPath+'\outputFile.csv -c -t -T -S' + @@ServerName
EXEC master..xp_cmdshell @cmdline
Este procedimento funciona bem quando executado a partir de dentro do SQL Server, mas não quando ele é chamado a partir do JDBC em Java.
Olhando para o monitor de atividade eu posso ver que uma transação operacional a consulta "SELECT * FROM ##OutputData"
está sendo bloqueado por transacção que está a executar o procedimento.Efetivamente travado o processo.
Eu brinquei com o código e não consigo ver por que isso iria acontecer em todos.Há algo que eu estou faltando em algum lugar?
Obrigado por qualquer ajuda...
EDITAR:Referências alteradas de Quartzo para JDBC, em vez disso, porque é provavelmente o mais relevante.
Solução
Creio que encontrei a resposta para este problema.
Desde a Primavera de utiliza-lo do próprio gerenciador de transações, é o bloqueio de tabelas que estou criando no procedimento.Quando executa o procedimento BCP, ele é executado no SQL Server, fora do escopo da Primavera de transação.Portanto, o BCP não é possível acessar as tabelas que ele precisa porque eles estão presos por Molas de transação.O procedimento não pode continuar porque ele está esperando BCP então, todo o processo atinge um impasse.
Tenho notado que isso ocorre sempre que um comando BCP tem uma transação externa, e apesar de o BCP tem um TransactionIsolation Bandeira, esta não parece ter qualquer efeito neste caso.
Para resolver o problema que eu estou usando agora os Trabalhos do SQL Server para executar o procedimento, sem transacções.
De qualquer maneira, pelo menos eu posso ser grato por esta pergunta me valeu o "Tumbleweed' crachá ;) Obrigado a todos!