Usuário com melhor resposta
A minha procedure não funciona via aplicação?.. o que pode ser!

Pergunta
-
Olá, Galera..
Gostaria de saber por que a minha procedure não gera o arquivo via aplicação..
USE [reqjud] GO /****** Object: StoredProcedure [dbo].[SPR_ENVELOPAMENTO_AUTOMATICO] Script Date: 02/24/2012 12:31:30 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[SPR_ENVELOPAMENTO_AUTOMATICO] /* AUTOR(A): PRISCILA HENRIQUES VERSÃO: 2.0 CRIADO EM: 27/01/2012 DECLARE @P_RETURN SMALLINT ,@P_MENSAGEM VARCHAR(200) EXEC SPR_ENVELOPAMENTO_AUTOMATICO 'ENVELOPAMENTO', 13, @P_RETURN OUTPUT ,@P_MENSAGEM OUTPUT SELECT @P_MENSAGEM */ @P_CHAVE VARCHAR(30), @P_ID_OFICIO_MODELO INT, @P_RETURN SMALLINT OUTPUT, @P_MENSAGEM VARCHAR(200) OUTPUT AS DECLARE @V_DATA VARCHAR(10), @V_USUARIO VARCHAR(20), @V_SENHA VARCHAR(20), @V_MONTAR_ARQUIVO VARCHAR(3000), @V_SERVIDOR VARCHAR(30), @V_DIR_ORIGEM VARCHAR(50), @V_DIR_DESTINO VARCHAR(50), @V_NOME_ARQUIVO VARCHAR(200), @V_NUMERO VARCHAR(40), @V_ID_OFICIO varchar(10), @V_ID_SITUACAO varchar(20), @V_CAMINHO_ARQUIVO VARCHAR(100), @V_NUMERO_COMUNICACAO VARCHAR(40), @V_CABECALHO VARCHAR(3000), @V_MENSAGEM VARCHAR(4000), @V_ANO VARCHAR(5), @V_DATA_EMISSAO VARCHAR(36), @V_LISTA_VALORES varchar(720), -- 7 LINHAS X 90 CARACTERES @V_POSICAO_ATUAL varchar(max), @V_LISTA_VALORES_MENSAGEM varchar(1890), -- 21 LINHAS X 90 CARACTERES @V_POSICAO_ATUAL_MENSAGEM VARCHAR(MAX) BEGIN -- INICIO DO PROCESSAMENTO /* REGRA PARA O GERAMENTO DO ARQUIVO: -> O CABECALHO DEVE TER NO MÁXIMO 7 LINHAS -> CADA LINHA DO CABECALHO DEVE CONTER 90 CARACTERES -> A MENSAGEM DEVE TER ENTRE 7 E 21 LINHAS, NÃO PODE TER MENSAGEM COM MENOS DE 7 LINHAS -> CADA LINHA DO CABECALHO DEVE CONTER 90 CARACTERES */ /* ---| Selecionar a data ativa da tabela de datas |----- */ SELECT @V_DATA = CONVERT(VARCHAR(10), DATA_ATUAL,112) FROM DATAS WHERE SITUACAO = 'A' /* ---| Selecionar ID_OFICIO PARA SER SALVO NA TABELA HISTORICO |----- */ SELECT @V_ID_OFICIO = ID_OFICIO, @V_ANO = ANO, @V_NUMERO= NUMERO, @V_DATA_EMISSAO = CASE SUBSTRING(CONVERT(VARCHAR(2),DATA_EMISSAO,101),1,2) WHEN '01' THEN 'Belém(PA), Janeiro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '02' THEN 'Belém(PA), Fevereiro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '03' THEN 'Belém(PA), Março de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '04' THEN 'Belém(PA), Abril de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '05' THEN 'Belém(PA), Maio de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '06' THEN 'Belém(PA), Junho de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '07' THEN 'Belém(PA), Julho de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '08' THEN 'Belém(PA), Agosto de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '09' THEN 'Belém(PA), Setembro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '10' THEN 'Belém(PA), Outubro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '11' THEN 'Belém(PA), Novembro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '12' THEN 'Belém(PA), Dezembro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO END, @V_CABECALHO = CABECALHO, @V_MENSAGEM = MENSAGEM FROM OFICIO_MODELO WHERE ID_OFICIO_MODELO = @P_ID_OFICIO_MODELO ---------------------------------------------------------------------TRATAR O CABECALHO---------------------------------------- --A) TABELA TEMPORÁRIA ARMAZENAR TODAS LINHAS DO CABECALHO CREATE TABLE #OFICIO_MODELO ( ID INT IDENTITY, ID_OFICIO_MODELO INT, ANO VARCHAR(4), NUMERO VARCHAR(2), DATA_EMISSAO VARCHAR(36), CABECALHO VARCHAR(720), MENSAGEM VARCHAR(1890) ) --B) TABELA TEMPORÁRIA QUE IRÁ ARMAZENAR AS LINHAS QUE SERÃO GRAVADAS NO ARQUIVO CREATE TABLE #OFICIO_MODELO_FINAL ( ID INT IDENTITY, ID_OFICIO_MODELO INT, ANO VARCHAR(4), NUMERO VARCHAR(2), DATA_EMISSAO VARCHAR(36), CABECALHO VARCHAR(720), MENSAGEM VARCHAR(1890) ) -- C) LISTA CONTENDO TODOS OS CARACTERES DO CABECALHO SET @V_LISTA_VALORES = (SELECT CABECALHO FROM OFICIO_MODELO WHERE ID_OFICIO_MODELO= @P_ID_OFICIO_MODELO) -- D) LOOP QUE TEM COMO FINAIDADE PEGAR CONJUNTO DE CARACTERES ANTES DA QUEBRA DE LINHA WHILE CHARINDEX (CHAR(13),@V_LISTA_VALORES,1) <> 0 BEGIN Set @V_POSICAO_ATUAL = SUBSTRING(@V_LISTA_VALORES,1,CHARINDEX(CHAR(13),@V_LISTA_VALORES,1)-1) Set @V_LISTA_VALORES = SUBSTRING(@V_LISTA_VALORES,CHARINDEX(CHAR(13),@V_LISTA_VALORES,1)+1,LEN(@V_LISTA_VALORES)) IF (LEN(@V_POSICAO_ATUAL) > 0 AND LEN(@V_POSICAO_ATUAL) <= 90) BEGIN INSERT INTO #OFICIO_MODELO(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,CABECALHO) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_POSICAO_ATUAL) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres(CABECALHO)' truncate TABLE #OFICIO_MODELO truncate TABLE #OFICIO_MODELO_FINAL RETURN 0 END END IF LEN(@V_LISTA_VALORES) > 0 AND LEN(@V_LISTA_VALORES) <= 90 BEGIN INSERT INTO #OFICIO_MODELO(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,CABECALHO) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_LISTA_VALORES) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres(CABECALHO)' truncate TABLE #OFICIO_MODELO truncate TABLE #OFICIO_MODELO_FINAL RETURN 0 END IF((SELECT COUNT(*) FROM #OFICIO_MODELO) > 7) BEGIN SET @P_MENSAGEM= 'Quantidade de linha excedidas(CABECALHO)' truncate TABLE #OFICIO_MODELO truncate TABLE #OFICIO_MODELO_FINAL RETURN 0 END ELSE INSERT INTO #OFICIO_MODELO_FINAL (ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,CABECALHO) SELECT TOP 7 ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,CABECALHO FROM #OFICIO_MODELO INSERT INTO ENVELOPAMENTO_CARTA_CABECALHO(ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,CABECALHO) SELECT TOP 7 ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,CABECALHO FROM #OFICIO_MODELO_FINAL ------------------------- TERMINO --------------------------------------------------------------------TRATAR MENSAGEM--------------------------------------------- CREATE TABLE #MENSAGEM ( ID INT IDENTITY, ID_OFICIO_MODELO INT, ANO VARCHAR(4), NUMERO VARCHAR(2), DATA_EMISSAO VARCHAR(36), CABECALHO VARCHAR(720), MENSAGEM VARCHAR(1890) ) CREATE TABLE #MENSAGEM_FINAL ( ID INT IDENTITY, ID_OFICIO_MODELO INT, ANO VARCHAR(4), NUMERO VARCHAR(2), DATA_EMISSAO VARCHAR(36), CABECALHO VARCHAR(720), MENSAGEM VARCHAR(1890) ) SET @V_LISTA_VALORES = (SELECT MENSAGEM FROM OFICIO_MODELO WHERE ID_OFICIO_MODELO = @P_ID_OFICIO_MODELO) WHILE CHARINDEX(CHAR(13),@V_LISTA_VALORES,1) <> 0 BEGIN SET @V_POSICAO_ATUAL = SUBSTRING(@V_LISTA_VALORES,1,CHARINDEX(CHAR(13),@V_LISTA_VALORES,1)-1) Set @V_LISTA_VALORES = SUBSTRING(@V_LISTA_VALORES,CHARINDEX(char(13),@V_LISTA_VALORES,1)+1,Len(@V_LISTA_VALORES)) If (LEN(@V_POSICAO_ATUAL) > 0 AND LEN(@V_POSICAO_ATUAL) <= 90) BEGIN INSERT INTO #MENSAGEM(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,MENSAGEM) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_POSICAO_ATUAL) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres(MENSAGEM) INÍCIO' TRUNCATE TABLE #MENSAGEM TRUNCATE TABLE #MENSAGEM_FINAL RETURN END END IF LEN(@V_LISTA_VALORES) > 0 AND LEN(@V_LISTA_VALORES) <= 90 BEGIN INSERT INTO #MENSAGEM(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,MENSAGEM) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_LISTA_VALORES) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres (MENSAGEM) FIM' DROP TABLE #MENSAGEM DROP TABLE #MENSAGEM_FINAL RETURN 0 END IF (SELECT COUNT(*) FROM #MENSAGEM) < 7 BEGIN SET @P_MENSAGEM = 'No mínino 7 linhas (MENSAGEM)' DROP TABLE #MENSAGEM DROP TABLE #MENSAGEM_FINAL RETURN 0 END IF (SELECT COUNT(*) FROM #MENSAGEM) > 21 BEGIN SET @P_MENSAGEM = 'Quantidade de linha excedidas no máximo 21(MENSAGEM)' DROP TABLE #MENSAGEM DROP TABLE #MENSAGEM_FINAL RETURN 0 END ELSE BEGIN INSERT INTO #MENSAGEM_FINAL (ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,MENSAGEM) SELECT TOP 21 ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,MENSAGEM FROM #MENSAGEM INSERT INTO ENVELOPAMENTO_CARTA_MENSAGEM(ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,MENSAGEM) SELECT TOP 21 ID_OFICIO_MODELO,ANO, NUMERO, DATA_EMISSAO,MENSAGEM FROM #MENSAGEM_FINAL END ------------------------- TERMINO /* ---| Selecionar A SITUAÇÃO DO OFICIO PARA SER SALVO NA TABELA HISTORICIO |----- */ SELECT @V_ID_SITUACAO = ID_SITUACAO, @V_NUMERO_COMUNICACAO = NUMERO_COMUNICACAO FROM OFICIO WHERE ID_OFICIO = @V_ID_OFICIO /* ---|INDICAR O ARQUIVO A SER EXPORTADO DA TABELA DE ARQUIVOS| --- */ Select @V_SERVIDOR = SERVIDOR, @V_DIR_ORIGEM = DIR_ORIGEM, @V_DIR_DESTINO = DIR_DESTINO, @V_NOME_ARQUIVO = 'reqjud_' + @V_NUMERO_COMUNICACAO +'_'+ CONVERT(VARCHAR(10),@P_ID_OFICIO_MODELO)+'_' +@V_DATA+'.txt' FROM ARQUIVO WHERE CHAVE = @P_CHAVE /* ---|MONTAR O ARQUIVO | --- */ SET @V_MONTAR_ARQUIVO = @V_SERVIDOR +@V_DIR_ORIGEM+@V_DIR_DESTINO+'\'+ @V_NOME_ARQUIVO SET @V_CAMINHO_ARQUIVO = @V_SERVIDOR +@V_DIR_ORIGEM+@V_DIR_DESTINO+@V_NOME_ARQUIVO /* --| INSERIR NA LOG DO SISTEMA ---| */ INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'E', 'INÍCIO DA EXPORTAÇÃO DO ARQUIVO: ' + @V_MONTAR_ARQUIVO) /* --| exportar o arquivo --| */ if (@P_CHAVE = 'ENVELOPAMENTO') BEGIN set @V_MONTAR_ARQUIVO = 'bcp "SELECT A.id_oficio_modelo,''Ref. Carta GCONF Nº '' + SUBSTRING(CONVERT(VARCHAR(4),A.ANO),1,4)+ ''/'' + CONVERT(VARCHAR(2),A.NUMERO) ,'' --- '',A.DATA_EMISSAO,'' --- '',A.CABECALHO, B.MENSAGEM FROM REQJUD.DBO.ENVELOPAMENTO_CARTA_CABECALHO A RIGHT JOIN REQJUD.DBO.ENVELOPAMENTO_CARTA_MENSAGEM B ON A.ID = B.ID " queryout ' + @V_MONTAR_ARQUIVO + ' -c -C ACP -t -S ' + @@SERVERNAME + ' -T' exec master..xp_cmdshell @V_MONTAR_ARQUIVO END /* -- LIMPAR AS TABELAS ENVELOPAMENTO_CARTA_CABECALHO / ENVELOPAMENTO_CARTA_MENSAGEM */ TRUNCATE TABLE ENVELOPAMENTO_CARTA_CABECALHO TRUNCATE TABLE ENVELOPAMENTO_CARTA_MENSAGEM /* -- INSERIR LOG NA TABELA LOG_SISTEMA */ INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'TÉRMINO DA EXPORTAÇAO DO ARQUIVO: ' + @V_MONTAR_ARQUIVO) /* INSERIR NA TABELA HISTÓRICO */ INSERT INTO OFICIO_HISTORICO values ( @V_ID_OFICIO, cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'SISTEMA', 'Envelopamento automático gerado: ' + @V_CAMINHO_ARQUIVO, @V_ID_SITUACAO) /* ELIMINAR AS TABELAS TEMPORÁRIAS LOCAIS */ DROP TABLE #OFICIO_MODELO DROP TABLE #OFICIO_MODELO_FINAL DROP TABLE #MENSAGEM DROP TABLE #MENSAGEM_FINAL /* MUDAR O CAMPO CASO PARA (A) DA TABELA OFÍCIO, INDICANDO QUE FOI GERADO O ARQUIVO ENVELOPAMENTO a) automático */ UPDATE OFICIO_MODELO SET STATUS = 'A' WHERE ID_OFICIO = @V_ID_OFICIO SET @P_MENSAGEM = 'ENVELOPAMENTO EXPORTADO COM SUCESSO NO : ' + @V_CAMINHO_ARQUIVO END -- FINAL DO PROCESSAMENTO
está é a procedure..
executando via banco funciona normalmente, porém quando é via aplicação não gera o arquivo..
creio que seja o BCP..
me ajudem!
priscila henriques
Respostas
-
Priscila, acredito que o problema não seja o BCP e sim o select que é executado no BCP.
Em uma thread anterior vc postou uma imagem onde o select está sofrendo um bloqueio por algum processo. Isole o comando que é montado em tempo de execução e faça os devidos testes com a query (select) que é executado no BCP.
Faça os testes também colocando o hint de lock WITH(NOLOCK) após a tabela neste select. Isto fará com que a tabela não seja alocada no momento da execução da query.
Ex. select * from tablename with(nolock)
Mas é extremamente importante verificar se existe algum processo externo ou até mesmo a sua procedure que está utilizando esta mesma tabela e não está finalizando a conexão.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Editado Eduardo Gomes Pereira sábado, 25 de fevereiro de 2012 22:46
- Marcado como Resposta Priscila henriques segunda-feira, 27 de fevereiro de 2012 15:06
-
Priscila, bom dia,
Se existe um insert antes de executar o select e este processo de insert está bloqueando o select, isto significa que o insert por algum motivo ainda não terminou. Logo quando vc colocar no select a clausula with(nolock) o select apenas retornará os dados comitados, ou seja, os novos registros que estão sendo inserediso pelo processo anterior vc não verá neste select, pois os mesmos ainda não foram comitados na tabela.
Tente utilizar comandos de transações como o BEGIN TRAN e o COMMIT para se certificar que o insert foi realizado e gravado em sua tabela. Coloque desta forma BEGIN TRAN -- > Sem insert --> COMMIT
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Marcado como Resposta Priscila henriques segunda-feira, 27 de fevereiro de 2012 15:06
Todas as Respostas
-
-
olá, Eduardo!.
desculpe a minha ignorância..
seria problema de permissão?..
a verdade é que eu clico no botão e fica executando a procedure e demora e o pior de tudo que não me retorna mensagem alguma..
fica no loop.. executando sem me retornar nenhuma mensagem.
creio que o problema seja no bcp.. porque eu coloquei uma tabela que não esteja na transação e o arquivo foi gerado!..
será que o problema não está nas tabela temporária e nos truncates e delete na tabela que está sendo chamada atráves do BCP.
priscila henriques
-
Priscila, verifique se existe alguma tabela na execução de sua procedure que está em lock. Para visualizar isto, abra um nova query e execute sp_who2 active.
Veja se algum objeto está em lock.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
-
-
Priscila, bem resumidamente é o seguinte. Quando vc faz algum transação em uma tabela, o padrão do SQL é deixar esta tabela exclusa até o finalizar a sua transação. Quando um outro processo tenta fazer alguma coisa nesta mesma tabela, onde a transação ainda não foi completada, o processo fica aguardando até que o outro processo atual termine a execução. Talvez o sua proc não termina de executar porque existe algum outro processo bloqueando a execução da sua proc.
Enfatizando que é apenas uma hipotese. Verifique se é este o problema mesmo. Se ele persistir é só postar aqui no fórum.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
Veja este material que fala exatamente sobre isto: http://support.microsoft.com/kb/224453/pt-br
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
Olá, Eduardo!..
certo..
agora porque quando a procedure é executada via banco o arquivo é gerado e na aplicação ocorre estes bloqueios?.. é isso que eu não entendo..
Eu pensei que fosse a chamada que estaria que problema só que eu percebi que não é isso,porque fica no execute e não sai mais e quando vou abri a mesma procedure não posso fazer nada!..
É isso que eu não entendo.. vou fazer tudo isso que você disse e verificar onde está acontecendo o bloqueio.
obrigada Eduardo!
priscila henriques
-
Priscila, como citei no thread anterior é apenas uma hipótese que é necessário investigar. Faça os testes necessários e verifique se isto mesmo. Se não for estou aqui a disposição para te ajudar.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
Olá, Eduardo..
sobre os testes necessário...
qual você me recomenda, foi citado anteriormente este comando: execute sp_who2
que tem como finalidade a identificação de um bloqueio.. como verifico isso?...
Além deste qual outro teste posso fazer já que o bloqueio está sendo realizado quando a procedure é executada via aplicação
?
priscila henriques
-
Priscila, siga o seguintes passos:
1 - Execute a procedure via aplicação. Quando passar um determinado tempo que a procedure estiver rodando, execute no SQL este comando (sp_who2 active)
2 - Este comando te retornará todos os processos ativos do SQL. Vá até os ultimos processos. Vc irá identificar a execução da sua procedure através da coluna ProgramName que possivelmente está com o nome da sua aplicação.
3 - Após identificado, verifique se na coluna Blkby deste processo está com algum ID. Se tiver significa que existe outro processo (SPID) bloqueando a execução da procedure.
Vc tem msn? Aí fica mais fácil investigar o problema.
Abs;
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
-
Priscila,
Alem das recomendações do Eduardo.
Para a verificação de forma simples se existe um processo bloqueado, execute:
SELECT * FROM sys.sysprocesses WHERE blocked <> 0
A primeira coluna (SPID) é o id da transação que esta bloqueada, ja o numero na coluna Blocked, é o SPID que esta bloqueando esta transação.
Em relação a possibilidade do Lock, não se se pode realmente ser isso, uma vez que voce fez acesso a essa tabela dentro da transação, seja um update ou um select (Com tablockx) por exemplo, essa tabela estara (Obviamente depende do nivel de isolamento dos outros usuarios...) lockada para voce, e voce tera plenos poderes sobre ela.
Outro motivo é o fato de alta utilização de tabelas temporarias locais, que estara disponivel apenas para sua sessão, tornando o Lock impossivel.
Ou seja, se existir algum lock, ele estara nas primeiras linhas aonde voce realmente pega dados de tabelas fixas e joga nas temporarias.
Como um simples debug, eu colocaria um insert pós captura dos dados das tabelas originais em uma tabela de log, apenas iformando que passou daquele ponto (Para essa visualisação, utilize SET TRANSACTION LEVEL READ UNCOMMITTED, se não voce entrara em lock nesta sessão e não conseguira ver nada....).
Eu estou mais propenso em relação ao permissionamento de escrita, quando voce executa com seu usuario direto no banco de dados, a não ser que um usuario Proxy esteja definido, voce ira bater no windows com o seu usuario (Autenticação via Windows na sua instancia?), Ja a aplicação, pode estar utilizando um usuario de banco de dados ou até mesmo um usuario de windows sem permissão, o que impossibilitara a criação do arquivo.
Como proposta de analise eu diria para voce colocar um EXECUTE AS no inicio de sua procedure e passar um usuario que tenha permissionamento direto no disco para escrita e leitura.
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Blog Empresa: www.tripletech.com.br/blog
Twitter: @FabrizzioCaputo
Email: fabrizzio.antoniaci@gmail.com -
-
eu vou tirar as tabelas temporárias , colocando tabelas físicas..
e sobre a permissão de gravar arquivo no disco, atráves do banco eu consigo gerar o arquivo.. a minha base possui uma tabela de parametros do sistema na qual eu passo a senha e usuário do banco..
priscila henriques
-
Fabrizzio e eduardo!..
descobri o problema e era o que eu imagina!..
o problema está no select dentro do bcp. criei a tabela de log e fui executando cada passo de pois que fui testar o bcp ficou no loop(processamento)..
galera o problema está no bcp!...
será o que bcp é mais indicado quando se deseja gerar arquivo atráves da aplicação?
priscila henriques
-
OLÁ,MEU AMIGOS!..
REALMENTE O PROBLEMA ESTÁ NO BCP, O SELECT QUE ESTÁ SENDO EXECUTADO DENTRO DELE.
SEGUE O CÓDIGO MODIFICADO:
USE [reqjud] GO /****** Object: StoredProcedure [dbo].[SPR_ENVELOPAMENTO_AUTOMATICO] Script Date: 02/25/2012 10:48:23 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[SPR_ENVELOPAMENTO_AUTOMATICO] /* AUTOR(A): PRISCILA HENRIQUES VERSÃO: 2.0 CRIADO EM: 27/01/2012 DECLARE @P_RETURN SMALLINT ,@P_MENSAGEM VARCHAR(200) EXEC SPR_ENVELOPAMENTO_AUTOMATICO 'ENVELOPAMENTO', 13, @P_RETURN OUTPUT ,@P_MENSAGEM OUTPUT SELECT @P_MENSAGEM */ @P_CHAVE VARCHAR(30), @P_ID_OFICIO_MODELO INT, @P_RETURN SMALLINT OUTPUT, @P_MENSAGEM VARCHAR(200) OUTPUT AS DECLARE @V_DATA VARCHAR(10), @V_USUARIO VARCHAR(20), @V_SENHA VARCHAR(20), @V_MONTAR_ARQUIVO VARCHAR(3000), @V_SERVIDOR VARCHAR(30), @V_DIR_ORIGEM VARCHAR(50), @V_DIR_DESTINO VARCHAR(50), @V_NOME_ARQUIVO VARCHAR(200), @V_NUMERO VARCHAR(40), @V_ID_OFICIO varchar(10), @V_ID_SITUACAO varchar(20), @V_CAMINHO_ARQUIVO VARCHAR(100), @V_NUMERO_COMUNICACAO VARCHAR(40), @V_CABECALHO VARCHAR(3000), @V_MENSAGEM VARCHAR(4000), @V_ANO VARCHAR(5), @V_DATA_EMISSAO VARCHAR(36), @V_LISTA_VALORES varchar(720), -- 7 LINHAS X 90 CARACTERES @V_POSICAO_ATUAL varchar(max), @V_LISTA_VALORES_MENSAGEM varchar(1890), -- 21 LINHAS X 90 CARACTERES @V_POSICAO_ATUAL_MENSAGEM VARCHAR(MAX), @V_CABECALHO_FINAL VARCHAR(720), @V_MENSAGEM_FINAL VARCHAR(1890), @V_USUARIO_BD varchar(100), @V_SENHA_BD varchar(100) /* REGRA PARA O GERAMENTO DO ARQUIVO: -> O CABECALHO DEVE TER NO MÁXIMO 7 LINHAS -> CADA LINHA DO CABECALHO DEVE CONTER 90 CARACTERES -> A MENSAGEM DEVE TER ENTRE 7 E 21 LINHAS, NÃO PODE TER MENSAGEM COM MENOS DE 7 LINHAS -> CADA LINHA D DEVE CONTER 90 CARACTERES */ /* ---| LIMPAR AS TABELAS |----- */ /* delete from ENVELOPAMENTO_CABECALHO delete from ENVELOPAMENTO_MENSAGEM */ /* ---| Selecionar a data ativa da tabela de datas |----- */ INSERT INTO LOG_SISTEMA values (getdate(), 'I', 'data_ativa') SELECT @V_DATA = CONVERT(VARCHAR(10), DATA_ATUAL,112) FROM DATAS WHERE SITUACAO = 'A' /* ---| Selecionar ID_OFICIO PARA SER SALVO NA TABELA HISTORICO |----- */ INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'data') SELECT @V_ID_OFICIO = ID_OFICIO, @V_ANO = ANO, @V_NUMERO= NUMERO, @V_DATA_EMISSAO = CASE SUBSTRING(CONVERT(VARCHAR(2),DATA_EMISSAO,101),1,2) WHEN '01' THEN 'Belém(PA), Janeiro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '02' THEN 'Belém(PA), Fevereiro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '03' THEN 'Belém(PA), Março de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '04' THEN 'Belém(PA), Abril de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '05' THEN 'Belém(PA), Maio de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '06' THEN 'Belém(PA), Junho de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '07' THEN 'Belém(PA), Julho de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '08' THEN 'Belém(PA), Agosto de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '09' THEN 'Belém(PA), Setembro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '10' THEN 'Belém(PA), Outubro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '11' THEN 'Belém(PA), Novembro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO WHEN '12' THEN 'Belém(PA), Dezembro de ' + SUBSTRING(CONVERT(VARCHAR(8),DATA_EMISSAO,101),4,2) + ' de ' + @V_ANO END, @V_CABECALHO = CABECALHO, @V_MENSAGEM = MENSAGEM FROM OFICIO_MODELO WHERE ID_OFICIO_MODELO = @P_ID_OFICIO_MODELO ---------------------------------------------------------------------TRATAR O CABECALHO---------------------------------------- -- C) LISTA CONTENDO TODOS OS CARACTERES DO CABECALHO SET @V_LISTA_VALORES = (SELECT CABECALHO FROM OFICIO_MODELO WHERE ID_OFICIO_MODELO= @P_ID_OFICIO_MODELO) -- D) LOOP QUE TEM COMO FINAIDADE PEGAR CONJUNTO DE CARACTERES ANTES DA QUEBRA DE LINHA -- primeiro log : INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'cabecalho início') WHILE CHARINDEX (CHAR(13),@V_LISTA_VALORES,1) <> 0 BEGIN Set @V_POSICAO_ATUAL = SUBSTRING(@V_LISTA_VALORES,1,CHARINDEX(CHAR(13),@V_LISTA_VALORES,1)-1) Set @V_LISTA_VALORES = SUBSTRING(@V_LISTA_VALORES,CHARINDEX(CHAR(13),@V_LISTA_VALORES,1)+1,LEN(@V_LISTA_VALORES)) IF (LEN(@V_POSICAO_ATUAL) > 0 AND LEN(@V_POSICAO_ATUAL) <= 90) BEGIN INSERT INTO ENVELOPAMENTO_CABECALHO (ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,CABECALHO) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_POSICAO_ATUAL) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres(CABECALHO)' RETURN 0 END END IF LEN(@V_LISTA_VALORES) > 0 AND LEN(@V_LISTA_VALORES) <= 90 BEGIN INSERT INTO ENVELOPAMENTO_CABECALHO(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,CABECALHO) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_LISTA_VALORES) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres(CABECALHO)' RETURN 0 END IF((SELECT COUNT(*) FROM ENVELOPAMENTO_CABECALHO) > 7) BEGIN SET @P_MENSAGEM= 'Quantidade de linha excedidas(CABECALHO)' RETURN 0 END -- primeiro log : INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'cabecalho fim') ------------------------- TERMINO --------------------------------------------------------------------TRATAR MENSAGEM--------------------------------------------- INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'mensagem inciio') SET @V_LISTA_VALORES = (SELECT MENSAGEM FROM OFICIO_MODELO WHERE ID_OFICIO_MODELO = @P_ID_OFICIO_MODELO) WHILE CHARINDEX(CHAR(13),@V_LISTA_VALORES,1) <> 0 BEGIN SET @V_POSICAO_ATUAL = SUBSTRING(@V_LISTA_VALORES,1,CHARINDEX(CHAR(13),@V_LISTA_VALORES,1)-1) Set @V_LISTA_VALORES = SUBSTRING(@V_LISTA_VALORES,CHARINDEX(char(13),@V_LISTA_VALORES,1)+1,Len(@V_LISTA_VALORES)) If (LEN(@V_POSICAO_ATUAL) > 0 AND LEN(@V_POSICAO_ATUAL) <= 90) BEGIN INSERT INTO ENVELOPAMENTO_MENSAGEM(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,MENSAGEM) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_POSICAO_ATUAL) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres(MENSAGEM) INÍCIO' RETURN 0 END END IF LEN(@V_LISTA_VALORES) > 0 AND LEN(@V_LISTA_VALORES) <= 90 BEGIN INSERT INTO ENVELOPAMENTO_MENSAGEM(ID_OFICIO_MODELO ,ANO, NUMERO, DATA_EMISSAO,MENSAGEM) VALUES(@P_ID_OFICIO_MODELO, @V_ANO,@V_NUMERO, @V_DATA_EMISSAO,@V_LISTA_VALORES) END ELSE BEGIN SET @P_MENSAGEM = 'Número de caracteres excedido por linha no máximo 90 caracteres (MENSAGEM) FIM' RETURN 0 END IF (SELECT COUNT(*) FROM ENVELOPAMENTO_MENSAGEM) < 7 BEGIN SET @P_MENSAGEM = 'No mínino 7 linhas (MENSAGEM)' RETURN 0 END IF (SELECT COUNT(*) FROM ENVELOPAMENTO_MENSAGEM) > 21 BEGIN SET @P_MENSAGEM = 'Quantidade de linha excedidas no máximo 21(MENSAGEM)' RETURN 0 END INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'mensagem fim') ------------------------- TERMINO /* ---| Selecionar A SITUAÇÃO DO OFICIO PARA SER SALVO NA TABELA HISTORICIO |----- */ INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'após mensagem') SELECT @V_ID_SITUACAO = ID_SITUACAO, @V_NUMERO_COMUNICACAO = NUMERO_COMUNICACAO FROM OFICIO WHERE ID_OFICIO = @V_ID_OFICIO /*****************************************************************/ -- Selecionar o usuário de banco de dados da chave USUARIO_BD /*****************************************************************/ Select @V_USUARIO_BD = VALOR_PARAMETRO FROM PARAMETRO_SISTEMA WHERE NOME_PARAMETRO = 'USUARIO_BD' /*****************************************************************/ -- Selecionar a senha do usuário de banco de dados da chave SENHA_BD /*****************************************************************/ Select @V_SENHA_BD = VALOR_PARAMETRO FROM PARAMETRO_SISTEMA WHERE NOME_PARAMETRO = 'SENHA_BD' /* ---|INDICAR O ARQUIVO A SER EXPORTADO DA TABELA DE ARQUIVOS| --- */ Select @V_SERVIDOR = SERVIDOR, @V_DIR_ORIGEM = DIR_ORIGEM, @V_DIR_DESTINO = DIR_DESTINO, @V_NOME_ARQUIVO = 'reqjud_' + @V_NUMERO_COMUNICACAO +'_'+ CONVERT(VARCHAR(10),@P_ID_OFICIO_MODELO)+'_' +@V_DATA+'.txt' FROM ARQUIVO WHERE CHAVE = @P_CHAVE /* ---|MONTAR O ARQUIVO | --- */ SET @V_MONTAR_ARQUIVO = @V_SERVIDOR +@V_DIR_ORIGEM+@V_DIR_DESTINO+'\'+ @V_NOME_ARQUIVO SET @V_CAMINHO_ARQUIVO = @V_SERVIDOR +@V_DIR_ORIGEM+@V_DIR_DESTINO+@V_NOME_ARQUIVO /* --| INSERIR NA LOG DO SISTEMA ---| */ INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'E', 'INÍCIO DA EXPORTAÇÃO DO ARQUIVO: ' + @V_MONTAR_ARQUIVO) /* --| exportar o arquivo --| */ if (@P_CHAVE = 'ENVELOPAMENTO') BEGIN /* set @V_MONTAR_ARQUIVO = 'bcp "SELECT ''Ref. Carta GCONF Nº '' + SUBSTRING(CONVERT(VARCHAR(4),A.ANO),1,4)+ ''/'' + CONVERT(VARCHAR(2),A.NUMERO) ,'' --- '','''+@V_DATA_EMISSAO+''','' ---- '',A.CABECALHO, B.MENSAGEM FROM REQJUD.DBO.ENVELOPAMENTO_CABECALHO A RIGHT JOIN REQJUD.DBO.ENVELOPAMENTO_MENSAGEM B ON A.ID = B.ID " queryout ' + @V_MONTAR_ARQUIVO + ' -c -C ACP -t -S ' + @@SERVERNAME + ' -U ' + @V_USUARIO_BD +' -P ' + @V_SENHA_BD */ set @V_MONTAR_ARQUIVO = 'bcp "SELECT * FROM REQJUD.DBO.ENVELOPAMENTO_MENSAGEM " queryout ' + @V_MONTAR_ARQUIVO + ' -c -C ACP -t -S ' + @@SERVERNAME + ' -T' exec master..xp_cmdshell @V_MONTAR_ARQUIVO,no_output END /* -- INSERIR LOG NA TABELA LOG_SISTEMA */ INSERT INTO LOG_SISTEMA values (cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'I', 'TÉRMINO DA EXPORTAÇAO DO ARQUIVO: ' + @V_MONTAR_ARQUIVO) /* INSERIR NA TABELA HISTÓRICO */ INSERT INTO OFICIO_HISTORICO values ( @V_ID_OFICIO, cast(@V_DATA + ' '+ (CONVERT(VARCHAR(8), getdate(),108)) as datetime), 'SISTEMA', 'Envelopamento automático gerado: ' + @V_CAMINHO_ARQUIVO, @V_ID_SITUACAO) /* MUDAR O CAMPO CASO PARA (A) DA TABELA OFÍCIO, INDICANDO QUE FOI GERADO O ARQUIVO ENVELOPAMENTO a) automático */ UPDATE OFICIO_MODELO SET STATUS = 'A' WHERE ID_OFICIO = @V_ID_OFICIO SET @P_MENSAGEM = 'ENVELOPAMENTO EXPORTADO COM SUCESSO NO : ' + @V_CAMINHO_ARQUIVO
o QUEÊ FAZER?priscila henriques
-
Priscila, acredito que o problema não seja o BCP e sim o select que é executado no BCP.
Em uma thread anterior vc postou uma imagem onde o select está sofrendo um bloqueio por algum processo. Isole o comando que é montado em tempo de execução e faça os devidos testes com a query (select) que é executado no BCP.
Faça os testes também colocando o hint de lock WITH(NOLOCK) após a tabela neste select. Isto fará com que a tabela não seja alocada no momento da execução da query.
Ex. select * from tablename with(nolock)
Mas é extremamente importante verificar se existe algum processo externo ou até mesmo a sua procedure que está utilizando esta mesma tabela e não está finalizando a conexão.
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Editado Eduardo Gomes Pereira sábado, 25 de fevereiro de 2012 22:46
- Marcado como Resposta Priscila henriques segunda-feira, 27 de fevereiro de 2012 15:06
-
-
Priscila,
Qual comando você está rodando para executar esta procedure dentro da sua aplicação? - Sua aplicação é .NET? - Seu ambiente, é windows 2008?
Você tentou rodar o trecho do bcp somente para testar de dentro da app deixando o mesmo em um sp no SQL?
- Seu SQL Server parece ser o express, isto está correto? - Você está rodando ele em uma versão do Windows onde on UAC possa estar habilitado? - Se sim, tente rodar como administrador o sistema ou desabilitar o UAC, veja se ajuda.
Abraços,
Marcos Leandro Rosa
-
Olá Marcos!..
a aplicação é java e estou rodando no ambiente windows!..
Eu já fiz todos os tipos de Teste e descobri que o problema está no select dentro do BCP...
Estou dando uma estudada em Lock, para entender isso!, por na verdade está acontecendo um bloqueio em um determinado processo fazendo com que a procedure não seja finalizada!..
Obrigada, Marcos!..
qualquer esclarecimentos sobre Lock ficarei grata! =)
priscila henriques
-
Eduardo!..
dúvidas..
ocorre bloqueio em cima das DML...
se dentro da minha tabela estou dando um insert e logo em seguida vem um select, pelo que eu percebi isso pode ocosionar um bloqueio..
então como devo tratar isso?.. aliás como devo tratar isso na minha procedure?..
eduardo, obrigada o comando que você me passou funcionou..
existe a possibilidade de eu tratar isso?
priscila henriques
-
Priscila, bom dia,
Se existe um insert antes de executar o select e este processo de insert está bloqueando o select, isto significa que o insert por algum motivo ainda não terminou. Logo quando vc colocar no select a clausula with(nolock) o select apenas retornará os dados comitados, ou seja, os novos registros que estão sendo inserediso pelo processo anterior vc não verá neste select, pois os mesmos ainda não foram comitados na tabela.
Tente utilizar comandos de transações como o BEGIN TRAN e o COMMIT para se certificar que o insert foi realizado e gravado em sua tabela. Coloque desta forma BEGIN TRAN -- > Sem insert --> COMMIT
Abs.
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
- Marcado como Resposta Priscila henriques segunda-feira, 27 de fevereiro de 2012 15:06
-
-
-