none
Criação de tabela temporaria RRS feed

  • Pergunta

  •  

    Oi pessoal,

     

    Seguindo a dica da galera para criar tables temporarias para unificar o resultado da minha procedure eu acabei encontrando um probleminha..

     

    bom, minha procedure traz tabelas diferente de acordo com o parametro passado, sendo assim, antes de criar a tabela temporaria eu tenho que ver que tipo de resultado eu vou ter, isso é tranquilo, pois existe um parametro chamado segmento que determina justamente isso.

    Porem, o exemplo abaixo (que é o que estou usando porem de forma simplificada) não funciona de forma alguma.

     

    Code Snippet

    DECLARE @SEGMENTO  NVARCHAR(4)

    SET  @SEGMENTO  = '1'

    if object_id('TEMPDB.dbo.#NOTAS') is not null  
     drop table #NOTAS

    IF (@SEGMENTO = '12')
    BEGIN
       CREATE TABLE #NOTAS (perletivo varchar (6) ,unidade varchar (50))
       SELECT object_id('tempdb.dbo.#NOTAS')   
    END

    ELSE
    BEGIN
     IF (@SEGMENTO = '1')
     BEGIN
        CREATE TABLE #NOTAS (perletivo varchar (6) ,SERIE varchar (50)  )
        SELECT object_id('tempdb.dbo.#NOTAS')   
     
     END

    END

     

     


     

    alias, funciona se eu deixar apenas um if de @SEGMENTO, quando eu analiso mais de uma vez esta variavel ocorre o seguinte erro

     

    Code Snippet
    There is already an object named '#NOTAS' in the database.

     

     

     

    Não sei se não posso mencionar mais de uma vez o nome de uma table temp .

     

    Bom pessoal, se alguem puder me dar uma ajudinha, acho que so falta isso para eu concluir meu script,

    Obrigadissima.


     

    terça-feira, 2 de dezembro de 2008 19:40

Respostas

  • Olá Fabixx,

     

    Não é impossível não. Basta fazer as devidas verificações. Você pode verificar se a tabela existe e caso exista fazer uma alteração com o ALTER TABLE ou até uma exclusão com o DROP TABLE ou o SELECT de fato.

     

    O problema é que tabelas temporárias tem escopo de sessão. Se você criar uma tabela temporária de fora de uma procedure e chamá-la de dentro de uma procedure ela será vista (mesmo que a procedure não a tenha criado). Essa não é uma boa utilização, mas pode acontecer. Ex:

     

    Code Snippet

    CREATE PROCEDURE usp AS SELECT * FROM #T

    GO

    CREATE TABLE #T (CODIGO INT)

    INSERT INTO #T VALUES (1)

    GO

    EXEC usp

     

    Por situações como essas é que é bom garantir os nomes de forma mais exclusiva.

     

    [ ]s,

     

    Gustavo

    terça-feira, 2 de dezembro de 2008 22:46

Todas as Respostas

  • Boa Tarde,

     

    Recomendo eliminar as tabelas após a utilização. O seu SQL Server é 2005 ?

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 2 de dezembro de 2008 19:54
  •  

    Ahh sim, ela será eliminada no final, porem para cada segmento eu tenho campos diferentes para criar, por isso tenho que:

     

    verificar o segmento,

    criar a tabela com os campos especificos,

    fazer a execução das procedures, inserindo os dados nesta tabela,

    mostrar o conteudo na tela

    e ai sim dropar a table

     

     

    Quando o segmento é 1 a tabela deve ter um campo chamado PO, Segmento 12 campos chamados AT, QR, CT , e assim vai para cada segmento, tem uma parte da tabela que é padrao, e uma serie de campos personalizados.

     

    Sera que nao posso ter no mesmo script mais de uma mensão pra criar uma table temp com o mesmo nome?

     

    Eu poderia criar tabelas com nomes diferentes, mas eu achei que isso nao seria um problema.

     

    [ ]s,

    terça-feira, 2 de dezembro de 2008 20:02
  • Boa Tarde,

     

    Você pode verificar e caso a tabela exista, ao invés de tentar criá-la, altere a estrutura com um ALTER TABLE adicionando os campos desejados.

     

    [ ]s,

     

    Gustavo

    terça-feira, 2 de dezembro de 2008 20:53
  • Olá,

    Entao, eu faço a verificação se a tabela existe no inicio do codigo, caso ela exista eu executo um drop table...

    Acho que vou criar uma com cada nome mesmo.

    Obrigada

    [  ] 's

    Fabixx

    terça-feira, 2 de dezembro de 2008 21:36
  • Olá Fabixx,

     

    Se você puder trabalhar com nomes diferentes eu acho melhor (isso evita outros problemas).

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 2 de dezembro de 2008 21:41
  • Sim, claro,

    na verdade eu gostaria de entender se existe mesmo a impossibilidade de referenciar o nome de uma table temp em um script.

     

    Vamos em frente pois os pepinos não param nao é verdade???

     

    Obrigadissima Gustavo,

    [  ]'s

     

    terça-feira, 2 de dezembro de 2008 21:48
  • Olá Fabixx,

     

    Não é impossível não. Basta fazer as devidas verificações. Você pode verificar se a tabela existe e caso exista fazer uma alteração com o ALTER TABLE ou até uma exclusão com o DROP TABLE ou o SELECT de fato.

     

    O problema é que tabelas temporárias tem escopo de sessão. Se você criar uma tabela temporária de fora de uma procedure e chamá-la de dentro de uma procedure ela será vista (mesmo que a procedure não a tenha criado). Essa não é uma boa utilização, mas pode acontecer. Ex:

     

    Code Snippet

    CREATE PROCEDURE usp AS SELECT * FROM #T

    GO

    CREATE TABLE #T (CODIGO INT)

    INSERT INTO #T VALUES (1)

    GO

    EXEC usp

     

    Por situações como essas é que é bom garantir os nomes de forma mais exclusiva.

     

    [ ]s,

     

    Gustavo

    terça-feira, 2 de dezembro de 2008 22:46
  • Bom dia a todos,

     

    Apenas para fechar o assunto. Acabei resolvendo o problema seguindo a sugestao do alter table.

    primeiro cria-s a tabela com os campos que são comuns a todas as situações, logo a seguir, são add os campos necessarios conforme cada um dos segmento

    A solução funcionou bem.

    Segue abaixo parte do codigo..

     

     

    Code Snippet

    .

    .

    .

    IF object_id('TEMPDB.dbo.#NOTAS') is not null drop table #NOTAS

     

    CREATE TABLE #NOTAS (perletivo varchar (6) ,unidade varchar (50),SERIE varchar (50)  ,nome varchar (100)  ,codcur int NOT NULL , codper int NOT NULL, codtun int NOT NULL , codetp int NOT NULL ,MATERIA varchar (16))

     

    IF @SEGMENTO = '12'
       ALTER TABLE #NOTAS ADD PH nvarchar (25), [AT] nvarchar (25), PT nvarchar (25),PD nvarchar (25),ANTES_REC nvarchar (25) , REC nvarchar (25)  , MEDIA_DEPOIS_REC nvarchar (25)

     

    ELSE


     

    IF @SEGMENTO = '3'
       ALTER TABLE #NOTAS ADD PRIMEIRA_MNOTA nvarchar (25)  ,SEGUNDA_MNOTA nvarchar (25),ANTES_REC nvarchar (25) ,REC nvarchar (25)  ,MEDIA_DEPOIS_REC nvarchar (25) 

     

    ELSE

     

    IF @SEGMENTO = '1'
       ALTER TABLE #NOTAS ADD PO nvarchar (25)  ,PC nvarchar (25),[AT] nvarchar (25),ANTES_REC nvarchar (25) ,REC nvarchar (25)  ,MEDIA_DEPOIS_REC nvarchar (25) 

     

    ELSE

     

    IF @SEGMENTO = '2'
       ALTER TABLE #NOTAS ADD PO nvarchar (25)  ,[ PI] nvarchar (25),[AT] nvarchar (25),ANTES_REC nvarchar (25) ,REC nvarchar (25)  ,MEDIA_DEPOIS_REC nvarchar (25) 

    .

    .

    .

     

     

    [ ]'s

    quarta-feira, 3 de dezembro de 2008 13:04