Проверьте, существует ли временная таблица, и удалите ее, прежде чем создавать временную таблицу. - PullRequest
584 голосов
/ 18 марта 2009

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

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

Ответы [ 13 ]

648 голосов
/ 20 марта 2009

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

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

Следующее прекрасно работает для меня в 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
70 голосов
/ 25 августа 2011

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

  1. Оператор изменения для таблицы
  2. GO
  3. Выберите выписку.

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

При использовании команды «GO» он будет рассматривать часть сценария до «GO» как один пакет и будет выполняться перед входом в запрос после «GO».

49 голосов
/ 12 июля 2017

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

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
48 голосов
/ 13 декабря 2015

Вместо dropping и повторного создания временной таблицы вы можете 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, используйте приведенный ниже синтаксис для удаления временной таблицы и ее повторного создания. Больше информации здесь MSDN

Синтаксис

DROP TABLE [ЕСЛИ СУЩЕСТВУЕТ] [имя_базы_данных. [имя_схемы]. | имя_схемы ] table_name [, ... n]

Запрос:

DROP TABLE IF EXISTS tempdb.dbo.#Results
CREATE TABLE #Results
  (
   Company             CHAR(3),
   StepId              TINYINT,
   FieldId             TINYINT,
  )
28 голосов
/ 01 сентября 2012

Это сработало для меня: social.msdn.microsoft.com / Форум / ен / transactsql / резьба / 02c6da90-954d-487d-a823-e24b891ec1b0? Prof = требуется

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

   and o.id = object_id(N'tempdb..#tempTable')
)
DROP TABLE #tempTable;
17 голосов
/ 07 июня 2014

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

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

.. даже если оно существует . Я только что обнаружил, что он хранится под другим именем (с добавлением _ подчеркивания), например:

#tempTable________

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

IF EXISTS(SELECT [name] FROM tempdb.sys.tables WHERE [name] like '#tempTable%') BEGIN
   DROP TABLE #tempTable;
END;
10 голосов
/ 21 марта 2009

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

Вы, похоже, запускаете один и тот же пакет, но запускаете его дважды после изменения: DROP ... CREATE ... edit ... DROP ... CREATE ..

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

6 голосов
/ 17 марта 2010

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

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

4 голосов
/ 05 октября 2017

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

DROP TABLE IF EXISTS schema.yourtable(even temporary tables #...)
4 голосов
/ 06 марта 2017

Я недавно видел, как администратор баз данных делал что-то похожее на это:

begin try
    drop table #temp
end try

begin catch 
    print 'table does not exist'
end catch 

create table #temp(a int, b int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...