Вопрос

Почему вы не можете этого сделать и есть ли обходной путь?

Вы получаете эту ошибку.

MSG 2714, уровень 16, состояние 1, строка 13 В базе данных уже есть объект с именем «#Temptable».

declare @x int

set @x = 1

if (@x = 0)
begin
    select 1 as Value into #temptable
end
else
begin
   select 2 as Value into #temptable
end

select * from #temptable

drop table #temptable
Это было полезно?

Решение

Это вопрос, состоящий из двух частей, и хотя Кев Фэйрчайлд дает хороший ответ на второй вопрос, он полностью игнорирует первый – почему выдается ошибка?

Ответ кроется в том, как работает препроцессор.Этот

SELECT field-list INTO #symbol ...

разрешается в дерево разбора, которое напрямую эквивалентно

DECLARE #symbol_sessionid TABLE(field-list)
INSERT INTO #symbol_sessionid SELECT field-list ...

и это помещает #symbol в таблицу имен локальной области.Задача _sessionid — предоставить каждому пользовательскому сеансу частное пространство имен;если вы укажете два хеша (##символ), это поведение будет подавлено.Удаление и удаление расширения sessionid (очевидно) прозрачно.

Результатом всего этого является то, что несколько предложений #symbol INTO создают несколько объявлений в одной и той же области, что приводит к сообщению 2714.

Другие советы

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

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

Первый шаг...проверьте, существует ли таблица...если это так, удалите его.Затем явно создайте таблицу, а не используйте SELECT INTO...

Так вы обнаружите, что это гораздо надежнее.

IF OBJECT_ID('tempdb..#temptable', 'U') IS NOT NULL 
BEGIN
DROP TABLE #temptable
END

CREATE TABLE #temptable (Value INT)

declare @x int

set @x = 1

if (@x = 0)
begin
    INSERT INTO #temptable (Value) select 1
end
else
begin
    INSERT INTO #temptable (Value) select 2
end

select * from #temptable

drop table #temptable

Кроме того, мы надеемся, что имена таблиц и полей упрощены для вашего примера и не соответствуют вашим Действительно позвони им ;)

-- Кевин Фэйрчайлд

Отложенное разрешение имен также является причиной того, что вы не можете быть уверены, что sp_dependents возвращает правильные результаты, ознакомьтесь с этим сообщением, которое я написал некоторое время назад. Зависите ли вы от sp_dependents (без каламбура)

Я предполагаю, что проблема в том, что вы не создали #temptable.

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

Судя по внешнему виду кода, вы, возможно, создавали его прототип в SQL Studio или подобном, не так ли?Могу ли я предположить, что вы запускали это несколько раз и дошли до того, что создали #temptable, но затем произошел сбой, прежде чем он дошел до конца и снова удалил таблицу?Перезапустите используемый вами инструмент редактирования SQL и повторите попытку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top