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

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

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

Ответ 1

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

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

Следующее работает отлично для меня в 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

Ответ 2

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

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

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

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

Ответ 3

Вместо 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,
  )

Ответ 4

Я думаю, проблема в том, что вам нужно добавить соглашение 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

Ответ 6

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

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

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

#tempTable________

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

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

Ответ 7

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

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

Ответ 8

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

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

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

Ответ 9

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

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

Ответ 10

Теперь вы можете использовать приведенный ниже синтаксис, если вы используете одну из новых версий SQL Server (2016+).

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

Ответ 11

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

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)

Ответ 12

В моем коде используется таблица 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

Ответ 13

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

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

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

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

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

Ответ 14

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