Ошибка SQL Server 2005 - PullRequest
       13

Ошибка SQL Server 2005

0 голосов
/ 05 сентября 2008

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

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

Сообщение 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

Ответы [ 6 ]

1 голос
/ 29 сентября 2008

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

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

SELECT field-list INTO #symbol ...

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

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

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

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

1 голос
/ 05 сентября 2008

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

1 голос
/ 05 сентября 2008

Первый шаг ... проверьте, существует ли таблица ... если она есть, удалите ее. Затем явно создайте таблицу, а не используйте 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

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

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

1 голос
/ 05 сентября 2008

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

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

0 голосов
/ 05 сентября 2008

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

0 голосов
/ 05 сентября 2008

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

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

...