Могу ли я восстановить временную таблицу после ее удаления? - PullRequest
4 голосов
/ 22 марта 2012

Дано:

код внутри хранимого процесса:

select bleh
  into #tblTemp
  from FunctionThatReturnsTable('some','params')

-- do some stuff

drop table #tblTemp

-- Error on this command:
-- 'There is already an object named '#tblTemp' in the database.'
select bleh
  into #tblTemp
  from FunctionThatReturnsTable('some','other params')

Проблема:

Я не могувоссоздать эту временную таблицу.Моя работа заключается в использовании # tmpTable1, # tmpTable2, # tempTable3 и т. Д. Есть ли способ обойти это?Было бы неплохо просто использовать одну временную таблицу каждый раз.

Если нет, то в чем причина этого?

Ответы [ 3 ]

11 голосов
/ 22 марта 2012

Как показал мой комментарий, я собираюсь предположить, что ответ заключается в том, что вы используете разные имена таблиц #temp для каждого создаваемого вами объекта. Это все равно, что сказать доктору: «Мне больно, когда я так поступаю». Его вероятный ответ будет: «Прекрати это делать!»

Причина, по которой это проблема, заключается в том, что синтаксический анализатор SQL Server пытается проанализировать весь пакет за один раз. Он ясно видит, что вы пытаетесь создать одну и ту же таблицу #temp несколько раз, но игнорирует промежуточную команду DROP (я не могу точно сказать, почему это так, поскольку у меня нет доступа к исходному коду ). Это та же самая причина, по которой вы не можете сделать это:

IF (1=1)
  CREATE TABLE #foo(i INT);
ELSE
  CREATE TABLE #foo(i VARCHAR(32));

Парсер видит два идентичных имени, но не может следовать логике IF/ELSE.

В дополнение к избежанию проблем, связанных с множеством таблиц #temp с одинаковыми именами, вызывает синтаксический анализатор, еще одно преимущество использования уникальных имен заключается в том, что они могут использоваться повторно, если вы явно не удаляете их. Это снизит нагрузку на базу данных tempdb с точки зрения метаданных / блокировки.

0 голосов
/ 24 января 2014

Это особенность, разработанная Microsoft и разъясненная Microsoft против идентификатора ошибки Microsoft Connect 666430

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

0 голосов
/ 22 марта 2012

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

Я бы предложил использовать exec sp_executesql 'create table'

...