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
- Instructie voor de tabel wijzigen
- GA
- 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 dropping
en de tijdelijke tabel opnieuw te maken, kun je truncate
en 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 2016
of Azure Sql Database
gebruikt, 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 #Results
heeft 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_ID
niet 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.