2008-09-05 12 views
0

Почему вы не можете это сделать и есть ли работа?Ошибка SQL Server 2005

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

Msg 2714, Level 16, State 1, Line 13 В базе данных уже имеется объект с именем '#emptable'.

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 

ответ

1

Это вопрос из двух частей и в то время как Kev Fairchil d дает хороший ответ на второй вопрос, который он полностью игнорирует первый - Почему возникает ошибка?

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

SELECT field-list INTO #symbol ... 

раскладывается синтаксического дерева, которое непосредственно эквивалентно

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

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

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

0

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

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

1

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

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

0

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

1

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

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

- Kevin Fairchild

1

Отложенное разрешение имен также причина, по которой вы не можете быть уверены, что sp_depends вернет правильные результаты, проверьте это сообщение Я написал некоторое время назад Do you depend on sp_depends (no pun intended)

Смежные вопросы