Usuário com melhor resposta
Problemas com tabelas temporarias globais

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 ##TabLotCorrenteAlguem sabe como posso resolver isso, teoricamente a tabela global tinha que funcionar
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 RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Samuel Rodrigues dos Anjos terça-feira, 7 de janeiro de 2014 21:58
- Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:34
-
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
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]
-
Junior eu troquei aqui
EXECUTE PROC_VALORCOMPROMETIDO @CODCLI,@CPF ,@ULTFECH ,@DTPROXFECH
SELECT @VALCOMP=VALCOMPATUAL,@PROXVALCOMP=PROXVALCOMP FROM ##VALCOMPROMETIDOE continua o erro aqui
Msg 208, Level 16, State 1, Procedure PROC_ALTLIMITE, Line 131
Invalid object name '##VALCOMPROMETIDO'. -
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 -
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
-
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 RamosMicrosoft Partner | MTA - SQL Server 2012---------------------------------- Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Samuel Rodrigues dos Anjos terça-feira, 7 de janeiro de 2014 21:58
- Marcado como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 19:34