Проверьте, существует ли временная таблица и удаляется ли она, прежде чем создавать временную таблицу

Я использую следующий код, чтобы проверить, существует ли временная таблица, и отбросить таблицу, если она существует до создания снова. Он отлично работает, пока я не меняю столбцы. Если я добавлю столбец позже, он даст сообщение об ошибке "Недопустимый столбец". Пожалуйста, дайте мне знать, что я делаю неправильно.

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
568
18 марта '09 в 19:34
источник поделиться
14 ответов

Я не могу воспроизвести ошибку.

Возможно, я не понимаю проблему.

Следующее работает отлично для меня в SQL Server 2005, а дополнительный столбец "foo" появляется во втором результате выбора:

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
634
20 марта '09 в 3:28
источник

Связанные вопросы


Похожие вопросы

Утверждение должно быть порядка

  • Оператор Alter для таблицы
  • GO
  • Выберите оператор.

Без "GO" между ними все будет рассматриваться как один единственный script, и когда оператор select ищет столбец, он не будет найден.

С "GO" он рассмотрит часть script до "GO" как одну партию и выполнит перед тем, как войти в запрос после "GO".

68
25 авг. '11 в 12:03
источник

Вместо dropping и повторного создания таблицы temp вы можете truncate и повторно использовать его

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

Если вы используете Sql Server 2016 или Azure Sql Database, используйте синтаксис ниже, чтобы удалить таблицу temp и воссоздать ее. Подробнее здесь MSDN

Синтаксис

ТАБЛИЦА DROP [IF EXISTS] [имя_базы. [имя_схемы]. | имя_схемы. ] table_name [,... n]

Query:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )
47
13 дек. '15 в 7:56
источник

Я думаю, проблема в том, что вам нужно добавить соглашение GO между ними для разделения исполнения на партии. Поскольку вторая капля script т.е. IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results не отбрасывала временную таблицу, являющуюся частью отдельной партии. Не могли бы вы попробовать ниже script.

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
46
12 июля '17 в 10:40
источник

Это сработало для меня: 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;
27
31 авг. '12 в 23:51
источник

Просто небольшой комментарий с моей стороны, так как OBJECT_ID не работает для меня. Он всегда возвращает, что

`#tempTable не существует

.. хотя он существует. Я просто нашел его сохраненным с другим именем (с пометкой _ подчеркивания) следующим образом:

#tempTable________

Это хорошо работает для меня:

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;
15
07 июня '14 в 1:14
источник

pmac72 использует GO для разбивки запроса на партии и использования ALTER.

Кажется, что вы запускаете ту же самую партию, но запускаете ее дважды после ее изменения: DROP... CREATE... edit... DROP... CREATE..

Возможно, разместите свой точный код, чтобы мы могли видеть, что происходит.

10
21 марта '09 в 15:16
источник

Я обычно ударяю эту ошибку, когда я уже создал временную таблицу; код, который проверяет инструкцию SQL для ошибок, видит "старую" таблицу temp на месте и возвращает ошибку в количестве столбцов в более поздних операциях, как если бы временная таблица никогда не удалялась.

После изменения количества столбцов в таблице temp после создания версии с меньшим количеством столбцов отбросьте таблицу и THEN запустите свой запрос.

6
17 марта '10 в 20:53
источник

Недавно я увидел, что DBA делает что-то похожее на это:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)
4
06 марта '17 в 12:17
источник

Теперь вы можете использовать синтаксис ниже, если используете одну из новых версий SSMS

DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
4
05 окт. '17 в 18:04
источник

В моем коде используется таблица Source, которая изменяется, и таблица Destination, которая должна соответствовать этим изменениям.

-- 
-- 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
09 мая '16 в 22:54
источник

Да, "неверный столбец" эта ошибка возникла из строки "выберите компанию, stepid, fieldid, NewColumn from #Results".

Есть две фазы запуска t-sql,

во-первых, на этом этапе сервер sql проверяет исправление введенной вами строки sql, включая столбец таблицы, и оптимизирует ваш запрос для максимально быстрого получения.

во-вторых, бег, извлечение данных.

Если таблица #Results существует, то процесс синтаксического анализа проверит, что указанные вами столбцы действительны или нет, иначе (таблица не существует) синтаксический анализ будет выполнен путем пропуска проверочных столбцов, как вы указали.

0
13 дек. '17 в 7:34
источник

Это может быть достигнуто с помощью одной строки кода:

IF OBJECT_ID('tempdb..#tempTableName') IS NOT NULL DROP TABLE #tempTableName;   
0
27 апр. '19 в 13:52
источник
CREATE TABLE #tempTable (id int IDENTITY(1, 1) PRIMARY KEY, name nvarchar(500), value nvarchar(500))    

BEGIN TRY
    DELETE FROM #tempTable

    PRINT 'Table deleted'

END TRY

BEGIN CATCH
    PRINT 'Table does not exist'

END CATCH
-5
16 янв. '16 в 8:30
источник

Посмотрите другие вопросы по меткам или Задайте вопрос