none
Problemas com tabelas temporarias globais RRS feed

  • Pergunta

  • Pessoal bom dia,

    Estou com um problema com uma tabela global, esta dando o seguinte erro

    Msg 208, Level 16, State 1, Procedure PROC_ALTLIMITE, Line 38
    Invalid object name '##TabLotCorrente'.

    Eu crio ela em uma procedure

     CREATE TABLE ##TabLotCorrente (
       [NUMFECCLI] int,
       [DATINI]    datetime,
       [DATFIN]    datetime
    )

       Insert into ##TabLotCorrente
       SELECT NUMFECCLI,DATINI,DATFIN
        FROM FECHCLIENTE
            WHERE CODCLI = @CODCLI
            AND GETDATE() >= DATINI AND GETDATE() < (DATFIN + 1)

        EXEC PROC_LOTECORRENTE @CODCLI ------ Essa é a chamada da procedure
        SELECT @LOTECOR = NUMFECCLI, @DATAINI = DATINI,@DATAFIM = DATFIN from ##TabLotCorrente   

    Alguem sabe como posso resolver isso, teoricamente a tabela global tinha que funcionar

    sexta-feira, 3 de janeiro de 2014 13:32

Respostas

  • DougAmFM,

    Acredito que o melhor à fazer na situação que você está é modificar o escopo da tabela temporária e sempre excluir esta tabela antes de uma nova execução.

    Desta forma, você garante que dados de um contexto de execução da mesma procedure por 2 ou mais usuários diferentes não se misturem, ocorrendo divergências na exibição do resultado.

    Sugiro você alterar sua procedure com o seguinte script abaixo:

    IF object_id('tempdb..#TabLotCorrente') IS NOT NULL 
    BEGIN
         DROP TABLE #TabLotCorrente
    END
    
    CREATE TABLE #TabLotCorrente (
       [NUMFECCLI] int,
       [DATINI]    datetime,
       [DATFIN]    datetime
    )
    
       Insert into #TabLotCorrente 
       SELECT NUMFECCLI,DATINI,DATFIN 
        FROM FECHCLIENTE 
            WHERE CODCLI = @CODCLI 
            AND GETDATE() >= DATINI AND GETDATE() < (DATFIN + 1)
    
        EXEC PROC_LOTECORRENTE @CODCLI ------ Essa é a chamada da procedure 
        SELECT @LOTECOR = NUMFECCLI, @DATAINI = DATINI,@DATAFIM = DATFIN from #TabLotCorrente   

    Se resolveu seu problema, não esqueça de marcar todos os posts que te ajudaram na solução !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    terça-feira, 7 de janeiro de 2014 20:44
    Moderador
  • DougAmFM,

    Esta correto de acordo com a sua análise e necessidade!!!

    Mas o Exec cria em tempo de execução uma nova sessão de processamento.

    Mas porque você esta excluíndo esta Temp Table?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:34
    sexta-feira, 3 de janeiro de 2014 16:31

Todas as Respostas

  • DougAmFM,

    Como você esta utilizando uma Tabela Temporária e a forma de Execução da sua Stored Procedure é através do comando Exec, isso faz com que o SQL Server abra uma nova sessão para o processamento da Stored Procedure, sendo assim, a Table Temp Global não é reconhecida!!!

    Para que seja possível utilizar uma Stored Procedure em conjunto com a Temp Table, troque o comando Exec por Execute, desta forma, o SQL Server vai utilizar a mesma sessão.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    sexta-feira, 3 de janeiro de 2014 15:53
  • Junior eu troquei aqui

                       EXECUTE PROC_VALORCOMPROMETIDO  @CODCLI,@CPF ,@ULTFECH ,@DTPROXFECH
                       
                       SELECT @VALCOMP=VALCOMPATUAL,@PROXVALCOMP=PROXVALCOMP FROM ##VALCOMPROMETIDO

    E continua o erro aqui

    Msg 208, Level 16, State 1, Procedure PROC_ALTLIMITE, Line 131
    Invalid object name '##VALCOMPROMETIDO'.

    sexta-feira, 3 de janeiro de 2014 16:21
  • Na verdade esta dando esse erro na procedure PROC_VALORCOMPROMETIDO

    There is already an object named '##VALCOMPROMETIDO' in the database.

    o erro que relatei 'Invalid object name '##VALCOMPROMETIDO'.'  é pq no BEGIN CATCH
      eu faço isso então esta correto  DROP TABLE ##VALCOMPROMETIDO

    sexta-feira, 3 de janeiro de 2014 16:24
  • DougAmFM,

    Esta correto de acordo com a sua análise e necessidade!!!

    Mas o Exec cria em tempo de execução uma nova sessão de processamento.

    Mas porque você esta excluíndo esta Temp Table?


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]

    • Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:34
    sexta-feira, 3 de janeiro de 2014 16:31
  • DougAmFM,

    Acredito que o melhor à fazer na situação que você está é modificar o escopo da tabela temporária e sempre excluir esta tabela antes de uma nova execução.

    Desta forma, você garante que dados de um contexto de execução da mesma procedure por 2 ou mais usuários diferentes não se misturem, ocorrendo divergências na exibição do resultado.

    Sugiro você alterar sua procedure com o seguinte script abaixo:

    IF object_id('tempdb..#TabLotCorrente') IS NOT NULL 
    BEGIN
         DROP TABLE #TabLotCorrente
    END
    
    CREATE TABLE #TabLotCorrente (
       [NUMFECCLI] int,
       [DATINI]    datetime,
       [DATFIN]    datetime
    )
    
       Insert into #TabLotCorrente 
       SELECT NUMFECCLI,DATINI,DATFIN 
        FROM FECHCLIENTE 
            WHERE CODCLI = @CODCLI 
            AND GETDATE() >= DATINI AND GETDATE() < (DATFIN + 1)
    
        EXEC PROC_LOTECORRENTE @CODCLI ------ Essa é a chamada da procedure 
        SELECT @LOTECOR = NUMFECCLI, @DATAINI = DATINI,@DATAFIM = DATFIN from #TabLotCorrente   

    Se resolveu seu problema, não esqueça de marcar todos os posts que te ajudaram na solução !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA - SQL Server 2012
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"
    terça-feira, 7 de janeiro de 2014 20:44
    Moderador