Ошибка SQL Server 2005

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

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

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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
218
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

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

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

Ответ принят как подходящий

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

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

SELECT field-list INTO #symbol ...

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

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

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

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

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