Usuário com melhor resposta
Criação de tabela temporaria

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 SnippetDECLARE @SEGMENTO NVARCHAR(4)
SET @SEGMENTO = '1'
if object_id('TEMPDB.dbo.#NOTAS') is not null
drop table #NOTASIF (@SEGMENTO = '12')
BEGIN
CREATE TABLE #NOTAS (perletivo varchar (6) ,unidade varchar (50))
SELECT object_id('tempdb.dbo.#NOTAS')
ENDELSE
BEGIN
IF (@SEGMENTO = '1')
BEGIN
CREATE TABLE #NOTAS (perletivo varchar (6) ,SERIE varchar (50) )
SELECT object_id('tempdb.dbo.#NOTAS')
ENDEND
alias, funciona se eu deixar apenas um if de @SEGMENTO, quando eu analiso mais de uma vez esta variavel ocorre o seguinte erro
Code SnippetThere 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.
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 SnippetCREATE
PROCEDURE usp AS SELECT * FROM #TGO
CREATE
TABLE #T (CODIGO INT)INSERT
INTO #T VALUES (1)GO
EXEC
uspPor situações como essas é que é bom garantir os nomes de forma mais exclusiva.
[ ]s,
Gustavo
Todas as Respostas
-
-
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,
-
-
-
-
-
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 SnippetCREATE
PROCEDURE usp AS SELECT * FROM #TGO
CREATE
TABLE #T (CODIGO INT)INSERT
INTO #T VALUES (1)GO
EXEC
uspPor situações como essas é que é bom garantir os nomes de forma mais exclusiva.
[ ]s,
Gustavo
-
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