Ошибка SQL Server 2005
-
09-06-2019 - |
Вопрос
Почему вы не можете этого сделать и есть ли обходной путь?
Вы получаете эту ошибку.
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 и повторите попытку.