sql-server - with - using temporary table in sql server




Verifique se existe uma tabela temporária e exclua se ela existir antes de criar uma tabela temporária (8)

A declaração deve ser da ordem

  1. Alterar instrução para a tabela
  2. VAI
  3. Selecione a instrução.

Sem '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 como 'GO' como um único lote e será executada antes de entrar na consulta após 'GO'.

Eu estou usando o código a seguir para verificar se a tabela temporária existe e solte a tabela se ela existir antes de criar novamente. Ele funciona bem, desde que eu não mude as colunas. Se eu adicionar uma coluna mais tarde, haverá um erro dizendo "coluna inválida". Por favor, deixe-me saber o que estou fazendo 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

Agora você pode usar a sintaxe abaixo se estiver usando uma das novas versões do SSMS

DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)

Em vez de dropping e recriar a tabela temporária, você pode truncate e reutilizá-la

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    Truncate TABLE #Results
else
    CREATE TABLE #Results
    (
        Company             CHAR(3),
        StepId              TINYINT,
        FieldId             TINYINT,
    )

Se você estiver usando o Sql Server 2016 ou o Azure Sql Database , use a sintaxe abaixo para descartar a tabela temporária e recriá-la. Mais informações aqui MSDN

Sintaxe

DROP TABLE [IF EXISTS] [database_name. [schema_name]. | schema_name. ] table_name [, ... n]

Inquerir:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )

Eu acho que o problema é que você precisa adicionar instrução GO no meio para separar a execução em lotes. Como o segundo script de IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results não IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results a tabela temporária sendo parte de um único lote. Você pode por favor, tente o script abaixo.

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
    DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
)

GO

select company, stepid, fieldid from #Results

IF OBJECT_ID('tempdb..#Results') IS NOT NULL
DROP TABLE #Results

CREATE TABLE #Results
(
    Company                CHAR(3),
    StepId                TINYINT,
    FieldId                TINYINT,
    NewColumn            NVARCHAR(50)
)

GO

select company, stepid, fieldid, NewColumn from #Results


Meu código usa uma tabela de Source que muda e uma tabela de Destination que deve corresponder a essas alterações.

-- 
-- Sample SQL to update only rows in a "Destination" Table
--  based on only rows that have changed in a "Source" table
--


--
-- Drop and Create a Temp Table to use as the "Source" Table
--
IF OBJECT_ID('tempdb..#tSource') IS NOT NULL drop table #tSource
create table #tSource (Col1 int, Col2 int, Col3 int, Col4 int)

--
-- Insert some values into the source
--
Insert #tSource (Col1, Col2, Col3, Col4) Values(1,1,1,1)
Insert #tSource (Col1, Col2, Col3, Col4) Values(2,1,1,2)
Insert #tSource (Col1, Col2, Col3, Col4) Values(3,1,1,3)
Insert #tSource (Col1, Col2, Col3, Col4) Values(4,1,1,4)
Insert #tSource (Col1, Col2, Col3, Col4) Values(5,1,1,5)
Insert #tSource (Col1, Col2, Col3, Col4) Values(6,1,1,6)

--
-- Drop and Create a Temp Table to use as the "Destination" Table
--
IF OBJECT_ID('tempdb..#tDest') IS NOT NULL drop Table #tDest
create table #tDest (Col1 int, Col2 int, Col3 int, Col4 int)

--
-- Add all Rows from the Source to the Destination
--
Insert #tDest
Select Col1, Col2, Col3, Col4 from #tSource


--
-- Look at both tables to see that they are the same
--
select *
from #tSource
Select *
from #tDest

--
-- Make some changes to the Source
--
update #tSource
    Set Col3=19
    Where Col1=1
update #tSource
    Set Col3=29
    Where Col1=2
update #tSource
    Set Col2=38
    Where Col1=3
update #tSource
    Set Col2=48
    Where Col1=4

--
-- Look at the Differences
-- Note: Only 4 rows are different. 2 Rows have remained the same.
--
Select Col1, Col2, Col3, Col4
from #tSource
except
Select Col1, Col2, Col3, Col4
from #tDest

--
-- Update only the rows that have changed
-- Note: I am using Col1 like an ID column
--
Update #tDest
    Set Col2=S.Col2,
        Col3=S.Col3,
        Col4=S.Col4
From    (   Select Col1, Col2, Col3, Col4
            from #tSource
            except
            Select Col1, Col2, Col3, Col4
            from #tDest
        ) S
Where #tDest.Col1=S.Col1 

--
-- Look at the tables again to see that
--  the destination table has changed to match
--  the source table.

select *
from #tSource
Select *
from #tDest

--
-- Clean Up
--
drop table #tSource
drop table #tDest

O pmac72 está usando o GO para dividir a consulta em lotes e usando um ALTER.

Parece que você está executando o mesmo lote, mas executando-o duas vezes depois de alterá-lo: DROP ... CREATE ... edit ... DROP ... CREATE ..

Talvez poste seu código exato para que possamos ver o que está acontecendo.


Recentemente vi um DBA fazer algo semelhante a isso:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)




alter-table