none
A minha procedure não funciona via aplicação?.. o que pode ser! RRS feed

  • 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

    sexta-feira, 24 de fevereiro de 2012 01:42

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


    sábado, 25 de fevereiro de 2012 22:45
  • 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

    segunda-feira, 27 de fevereiro de 2012 13:23

Todas as Respostas

  • Priscila, bom dia.

    Qual a mensagem de erro que sua aplicação reporta? Talvez seja algum problema de permissionamento.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    sexta-feira, 24 de fevereiro de 2012 11:01
  • 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

    sexta-feira, 24 de fevereiro de 2012 12:12
  • 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

    sexta-feira, 24 de fevereiro de 2012 12:26
  • Perfeito!.. Eduardo!..

    vou verificar! e te dou retorno.


    priscila henriques

    sexta-feira, 24 de fevereiro de 2012 13:31
  • E se estiver em Lock o que isso significa?..

    Já que eu não definir isso como Lock..

    é bloqueio ou a procedure está mal elaborada

    ?


    priscila henriques

    sexta-feira, 24 de fevereiro de 2012 13:35
  • 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

    sexta-feira, 24 de fevereiro de 2012 13:53
  • 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

    sexta-feira, 24 de fevereiro de 2012 13:53
  • 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

    sexta-feira, 24 de fevereiro de 2012 15:22
  • 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

    sexta-feira, 24 de fevereiro de 2012 15:25
  • 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

    sexta-feira, 24 de fevereiro de 2012 16:10
  • 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

    sexta-feira, 24 de fevereiro de 2012 16:34
  • Eduardo, estou no Banco e não tenho acesso ao gtalk ou msn..

    vai ai o meu gtalk: priscila.henriques.ribeiro@gmail.com me add.

    vou fazer o teste e te retorno.

    =)


    priscila henriques

    sexta-feira, 24 de fevereiro de 2012 17:47
  • 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

    sexta-feira, 24 de fevereiro de 2012 18:13
    Moderador
  • Oi Fabrizzio!..

    está aqui a imagem dos processos do banco de dados:


    priscila henriques

    sexta-feira, 24 de fevereiro de 2012 23:39
  • 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

    sexta-feira, 24 de fevereiro de 2012 23:42
  • 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

    sábado, 25 de fevereiro de 2012 15:44
  • 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

    sábado, 25 de fevereiro de 2012 18:24
  • 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


    sábado, 25 de fevereiro de 2012 22:45
  • Eduardo!.. 

    pode deixar.. eu vou dar uma lidar no site que você passou sobre isso e te dou um retorno!..

    valeu! =)


    priscila henriques

    domingo, 26 de fevereiro de 2012 00:57
  • 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

    domingo, 26 de fevereiro de 2012 02:59
  • 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

    segunda-feira, 27 de fevereiro de 2012 00:46
  • 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

    segunda-feira, 27 de fevereiro de 2012 12:43
  • 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

    segunda-feira, 27 de fevereiro de 2012 13:23
  • Olá, Eduardo!...

    Obrigada pelos esclarecimetos..

    só mais uma coisa para fecha está thread ..

    Não entendi : BEGIN TRAN -- > Sem insert --> COMMIT,  o que você está querendo dizer "Sem insert"  =)


    priscila henriques

    segunda-feira, 27 de fevereiro de 2012 14:29
  • Desculpe Priscila, digitei errado..rsrsr...

    Na verdade o que eu estava me referindo era ao "Seu insert"...

    Coloque Begin Tran --> Seu insert -- > Commit...

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    segunda-feira, 27 de fevereiro de 2012 14:31
  • kkkk..

    Tá perdoado Eduardo!..

    você é 10!..

    Obrigada!

    Tópico fechado!


    priscila henriques

    segunda-feira, 27 de fevereiro de 2012 15:06