Controleer of er een tijdelijke tabel bestaat en verwijder deze als deze bestaat voordat u een tijdelijke tabel maakt

Ik gebruik de volgende code om te controleren of de tijdelijke tabel bestaat en verwijder de tabel als deze bestaat voordat ik hem opnieuw maak. Het werkt prima zolang ik de kolommen niet verander. Als ik later een kolom toevoeg, krijg ik een foutmelding “ongeldige kolom”. Laat me alsjeblieft weten wat ik verkeerd doe.

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

Antwoord 1, autoriteit 100%

Ik kan de fout niet reproduceren.

Misschien begrijp ik het probleem niet.

Het volgende werkt prima voor mij in SQL Server 2005, met de extra “foo” kolom die in het tweede selectieresultaat verschijnt:

IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO
CREATE TABLE #Results ( Company CHAR(3), StepId TINYINT, FieldId TINYINT )
GO
select company, stepid, fieldid from #Results
GO
ALTER TABLE #Results ADD foo VARCHAR(50) NULL
GO
select company, stepid, fieldid, foo from #Results
GO
IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results
GO

Antwoord 2, autoriteit 12%

De verklaring moet van de orde zijn

  1. Instructie voor de tabel wijzigen
  2. GA
  3. Selecteer uitspraak.

Zonder ‘GO’ ertussen, wordt het hele ding beschouwd als één enkel script en wanneer de select-opdracht naar de kolom zoekt, wordt deze niet gevonden.

Met ‘GO’ , zal het het deel van het script tot aan ‘GO’ als één enkele batch beschouwen en zal het worden uitgevoerd voordat het in de query komt na ‘GO’.


Antwoord 3, autoriteit 9%

In plaats van droppingen de tijdelijke tabel opnieuw te maken, kun je truncateen deze opnieuw gebruiken

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

Als u Sql Server 2016of Azure Sql Databasegebruikt, gebruik dan de onderstaande syntaxis om de tijdelijke tabel te verwijderen en opnieuw te maken. Meer info hier MSDN

Syntaxis

DROP TABLE [ INDIEN BESTAAT ] [ database_name . [ schemanaam ] . |
schema_naam . ] table_name [ ,…n ]

Vraag:

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

Antwoord 4, autoriteit 8%

Ik denk dat het probleem is dat u Go-verklaring tussendoor moet toevoegen om de uitvoering in batches te scheiden. Als het tweede druppel script d.w.z. IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Resultsheeft de temp-tabel niet laten vallen als deel van een enkele batch. Kun je het onderstaande script proberen.

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

Antwoord 5, Autoriteit 6%

Dit kan worden bereikt met een enkele regel van code:

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

Antwoord 6, Autoriteit 4%

Dit werkte voor mij:
social.msdn.microsoft.com/forums/ EN / transactsql / thread / 02c6da90-954D-487D-A823-E24B891EC1B0? Prof = vereist

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U') 
   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;

Antwoord 7, Autoriteit 3%

Even een kleine opmerking van mijn kant omdat de OBJECT_IDniet werkt voor mij. Het geeft altijd dat

`#tempTable bestaat niet

..ook al bestaat het wel. Ik ontdekte net dat het is opgeslagen met een andere naam (achteraf gefixeerd door _onderstrepingstekens), zoals:

#tempTable________

Dit werkt goed voor mij:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;

Antwoord 8, autoriteit 3%

U kunt nu de onderstaande syntaxis gebruiken als u een van de nieuwe versies van SQL Server (2016+) gebruikt.

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

Antwoord 9

pmac72gebruikt GO om de zoekopdracht op te splitsen in batches en gebruikt een ALTER.

Het lijkt erop dat u dezelfde batch uitvoert, maar deze twee keer uitvoert nadat u deze hebt gewijzigd: DROP… CREATE… edit… DROP… CREATE…

Misschien post je exactecode zodat we kunnen zien wat er aan de hand is.


Antwoord 10

Dit werkte voor mij,

IF OBJECT_ID('tempdb.dbo.#tempTable') IS NOT NULL 
DROP TABLE #tempTable; 

Hier is tempdb.dbo(dbo is niets anders dan je schema) belangrijker.


Antwoord 11

Meestal krijg ik deze fout wanneer ik de tijdelijke tabel al heb gemaakt; de code die de SQL-instructie op fouten controleert, ziet de “oude” tijdelijke tabel op zijn plaats en retourneert een verkeerde telling op het aantal kolommen in latere instructies, alsof de tijdelijke tabel nooit is verwijderd.

Nadat u het aantal kolommen in een tijdelijke tabel hebt gewijzigd nadat u al een versie met minder kolommen hebt gemaakt, laat u de tabel vallen en voert u DAN uw zoekopdracht uit.


Antwoord 12

Ik zag onlangs een DBA iets soortgelijks doen:

begin try
    drop table #temp
end try
begin catch 
    print 'table does not exist'
end catch 
create table #temp(a int, b int)

Antwoord 13

Mijn code gebruikt een Source-tabel die verandert, en een Destination-tabel die met die wijzigingen moet overeenkomen.

-- 
-- 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

Antwoord 14

Opmerking: dit werkt ook voor de Temp Tables.

d.w.z.

IF OBJECT_ID('tempdb.dbo.##AuditLogTempTable1', 'U') IS NOT NULL
DROP TABLE ##AuditLogTempTable1

Opmerking: dit type opdracht alleen geschikte post SQL Server 2016.
Vraag jezelf .. Heb ik klanten die nog steeds op SQL Server 2012 zijn?

DROP TABLE IF EXISTS ##AuditLogTempTable1

Antwoord 15

Ja, “Ongeldige kolom” Deze fout is opgehaald bij de lijn “Selecteer bedrijf, stepain, felidi, newcolumn van #resultaten”.

Er zijn twee fasen van het Runing T-SQL,

Ten eerste, parseren, in deze fase Controleer de SQL-server de correctie van u ingediende SQL-string, inclusief kolom van de tabel en geoptimaliseerd uw vraag voor het snelste retrival.

Ten tweede, hardlopen, de data’s opnieuw bevrijden.

Als de tabel #resultaten bestaan, controleert het parseringsproces de kolommen die u hebt opgegeven, zijn geldig of niet, anders (tabel bestaat niet) Het parseren wordt door de aanspreekbare kolommen doorgegeven als u opgegeven.


Antwoord 16

Wanneer u een kolom in een Temp-tabel wijzigt, moet u de tabel laten vallen voordat u de query weer uitvoert. (Ja, het is irritant, precies wat u moet doen.)

Ik heb altijd aangenomen dat dit is omdat de cheque “Ongeldige kolom” wordt uitgevoerd door Parser voordat de query wordt uitgevoerd, dus het is gebaseerd op de kolommen in de tabel voordat deze is gevallen ….. en dat is wat PNBS is ook gezegd.

Other episodes