Estou usando o código a seguir para verificar se a tabela temporária existe e soltar a tabela, se existir, antes de criar novamente. Funciona bem desde que eu não mude as colunas. Se eu adicionar uma coluna posteriormente, ocorrerá um erro dizendo "coluna inválida". Por favor, deixe-me saber o que estou fazendo de errado.
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
)
select company, stepid, fieldid from #Results
--Works fine to this point
IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results
CREATE TABLE #Results
(
Company CHAR(3),
StepId TINYINT,
FieldId TINYINT,
NewColumn NVARCHAR(50)
)
select company, stepid, fieldid, NewColumn from #Results
--Does not work
BEGIN TRANSACTION; CREATE TABLE #Results; ...; DROP TABLE #Results; COMMIT
. Se a transação for bem-sucedida, a tabela será removida. Se falhar, a tabela também desaparecerá (desde que foi criada dentro da transação). De qualquer forma: Não há necessidade de verificar se a tabela já existe.Respostas:
Não consigo reproduzir o erro.
Talvez eu não esteja entendendo o problema.
O seguinte funciona bem para mim no SQL Server 2005, com a coluna "foo" extra aparecendo no segundo resultado selecionado:
fonte
'tempdb..#name'
é exatamente o que eu precisava. Eu estava usando'dbo.#name'
, como um tolo. Eu recebo otempdb
papel, mas o que há com os pontos duplos?A declaração deve ser da ordem
Sem o 'GO' no meio, a coisa toda será considerada como um único script e, quando a instrução select procurar a coluna, ela não será encontrada.
Com 'GO', ele considerará a parte do script até 'GO' como um único lote e será executado antes de entrar na consulta após 'GO'.
fonte
Em vez de
dropping
e recriar a tabela temporária, você podetruncate
e reutilizá-laSe você estiver usando
Sql Server 2016
ouAzure Sql Database
use a sintaxe abaixo para descartar a tabela temporária e recriá-la. Mais informações aqui MSDNSintaxe
Inquerir:
fonte
truncate/reuse
método seria mais eficiente que oDROP TABLE IF EXISTS
onSql Server 2016
eAzure Sql Database
também. Não é este o caso?DROP TABLE IF Exists
SQL 2016 ou o Azure? A sintaxe está disponível a partir do SQL 2008. Consulte o link MSDN na sua resposta? Fator de desempenho?DROP TABLE
é suportada a partir do SQL Server 2008, mas aIF EXISTS
cláusula foi introduzida em 2016.INTO
: select * INTO #HistoricoUserTable from dbo.HistoricoUserAcho que o problema é que você precisa adicionar a instrução GO no meio para separar a execução em lotes. Como o segundo script de descarte, ou seja
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
, não descartou a tabela temporária fazendo parte de um único lote. Você pode tentar o script abaixo.fonte
tempdb..
no código acima é muito importante. Ele precisa preceder o nome da tabela temporária. Simplesmente verificarOBJECT_ID('#Results')
não é suficiente. As tabelas temporárias são armazenadas no banco de dados TempDB. Por Microsoft: o banco de dados do sistema TempDB é um recurso global disponível para todos os usuários conectados à instância do SQL Server ou ao banco de dados SQLtempdb
ou não desaparecerá.Isso pode ser realizado com uma única linha de código:
fonte
Isso funcionou para mim: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required
fonte
Apenas um pequeno comentário do meu lado, pois o
OBJECT_ID
não funciona para mim. Sempre retorna que..even embora não existir. Acabei de descobrir que ele é armazenado com um nome diferente (postfixado por
_
sublinhados) da seguinte forma:#tempTable________
Isto funciona bem para mim:
fonte
Agora você pode usar a sintaxe abaixo se estiver usando uma das novas versões do SQL Server (2016 ou superior).
fonte
Incorrect syntax near the keyword 'IF'.
IF [NOT] EXISTS
cláusula está disponível no SQL Server 2016. Não importa qual versão do SSMS você está usando.O pmac72 está usando o GO para dividir a consulta em lotes e usando um ALTER.
Você parece estar executando o mesmo lote, mas executando-o duas vezes após alterá-lo: DROP ... CREATE ... edit ... DROP ... CREATE ..
Talvez publique seu código exato para que possamos ver o que está acontecendo.
fonte
Eu geralmente acerto esse erro quando já criei a tabela temporária; o código que verifica erros na instrução SQL vê a tabela temporária "antiga" no lugar e retorna um número incorreto no número de colunas em instruções posteriores, como se a tabela temporária nunca fosse descartada.
Depois de alterar o número de colunas em uma tabela temporária, depois de criar uma versão com menos colunas, descarte a tabela e, em seguida, execute sua consulta.
fonte
Vi recentemente um DBA fazer algo semelhante a este:
fonte
Meu código usa uma
Source
tabela que muda e umaDestination
tabela que deve corresponder a essas alterações.fonte
Sim, "coluna inválida" esse erro foi gerado a partir da linha "selecione empresa, stepid, fieldid, NewColumn de #Results".
Existem duas fases de execução do t-sql,
primeiro, analisando, nesta fase, o servidor sql verifica a correção da string sql que você enviou, incluindo a coluna da tabela, e otimizou sua consulta para uma recuperação mais rápida.
segundo, executando, recuperando os dados.
Se a tabela #Results existir, o processo de análise verificará se as colunas especificadas são válidas ou não; caso contrário (a tabela não existe), a análise passará pelas colunas de verificação conforme você especificou.
fonte
Ao alterar uma coluna em uma tabela temporária, você deve soltar a tabela antes de executar a consulta novamente. (Sim, é irritante. Exatamente o que você precisa fazer.)
Sempre presumi que isso ocorre porque a verificação de "coluna inválida" é feita pelo analisador antes da execução da consulta, portanto, ela se baseia nas colunas da tabela antes de ser descartada ... e foi o que o pnbs também disse.
fonte