Question Vérifier si une table temporaire existe et supprimer si elle existe avant de créer une table temporaire


J'utilise le code suivant pour vérifier si la table temporaire existe et déposez la table si elle existe avant de la créer à nouveau. Cela fonctionne bien tant que je ne change pas les colonnes. Si j'ajoute une colonne plus tard, cela donnera une erreur disant "colonne invalide". S'il vous plaît laissez-moi savoir ce que je fais mal.

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

498
2018-03-18 16:34


origine


Réponses:


Je ne peux pas reproduire l'erreur.

Je ne comprends peut-être pas le problème.

Ce qui suit fonctionne bien pour moi dans SQL Server 2005, avec la colonne supplémentaire "foo" apparaissant dans le second résultat de sélection:

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

573
2018-03-20 00:28



La déclaration devrait être de l'ordre

  1. Alter instruction pour la table
  2. ALLER
  3. Sélectionnez une déclaration.

Sans 'GO' entre les deux, tout sera considéré comme un seul script et lorsque l'instruction select recherchera la colonne, elle ne sera pas trouvée.

Avec 'GO', il considérera la partie du script jusqu'à 'GO' comme un seul lot et s'exécutera avant d'entrer dans la requête après 'GO'.


55
2017-08-25 09:03



Au lieu de dropping et recréer la table temporaire, vous pouvez truncate et le réutiliser

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

Si vous utilisez Sql Server 2016 ou Azure Sql Database puis utilisez la syntaxe ci-dessous pour supprimer la table temporaire et la recréer. Plus d'infos ici MSDN

Syntaxe

DROP TABLE [IF EXISTS] [nom de la base de données. [nom_schéma]. |   nom_schéma. ] nom_table [, ... n]

Question:

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

35
2017-12-13 04:56



Cela a fonctionné pour moi: social.msdn.microsoft.com/Forums/en/transactsql/thread/02c6da90-954d-487d-a823-e24b891ec1b0?prof=required

if exists (
    select  * from tempdb.dbo.sysobjects o
    where o.xtype in ('U') 

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;

26
2017-08-31 20:51



Je pense que le problème est que vous devez ajouter une instruction GO entre pour séparer l'exécution en lots. Comme deuxième script de suppression, c'est-à-dire IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results n'a pas laissé tomber la table temporaire faisant partie d'un lot unique. Pouvez-vous s'il vous plaît essayer le script ci-dessous.

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

26
2017-07-12 07:40



Juste un petit commentaire de ma part depuis le OBJECT_ID ça ne marche pas pour moi. Il retourne toujours que

`#tempTable n'existe pas

..même si elle Est-ce que exister. Je viens de trouver qu'il est stocké avec un nom différent (postfixé par _ souligne) comme ça:

#tempTable________ 

Cela fonctionne bien pour moi:

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

16
2018-06-06 22:14



pmac72 utilise GO pour décomposer la requête en lots et utiliser un ALTER.

Vous semblez exécuter le même lot mais l'exécuter deux fois après l'avoir modifié: DROP ... CREATE ... edit ... DROP ... CREATE ..

Peut-être poster votre exact code afin que nous puissions voir ce qui se passe.


9
2018-03-21 12:16



Je rencontre généralement cette erreur lorsque j'ai déjà créé la table temporaire; Le code qui vérifie les erreurs dans l'instruction SQL voit l'ancienne "table temporaire" en place et renvoie un compte erroné sur le nombre de colonnes dans les instructions ultérieures, comme si la table temporaire n'avait jamais été supprimée.

Après avoir modifié le nombre de colonnes d'une table temporaire après avoir déjà créé une version avec moins de colonnes, supprimez la table et exécutez ensuite votre requête.


5
2018-03-17 17:53



J'ai récemment vu un DBA faire quelque chose de similaire à ceci:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)

4
2018-03-06 09:17



Mon code utilise un Source table qui change, et un Destination table qui doit correspondre à ces changements.

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

3
2018-05-09 19:54