2016-03-08 7 views
1

Я капельный/создавая временную таблицу много раз в одном скриптеСуществует уже объект с именем «#xxxx» в базе данных

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL 
DROP TABLE #uDims 

select * into #uDims from table1 

.... do something else 

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL 
DROP TABLE #uDims 

select * into #uDims from table2 -- >> I get error here 

.... do something else 

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL 
DROP TABLE #uDims 

select * into #uDims from table3 -- >> and here 

.... do something else 

при попытке запустить сценарий, я получаю

There is already an object named '#uDims' in the database. 

на второй и третий «выберите в ...»

То есть, очевидно, ошибка времени компиляции. Если я запустил секцию сценария по разделам, все будет хорошо работать.

Существует много обходных путей для этой проблемы, но я хочу знать, почему SSMS расстроена этим.

+3

DDL без GO? –

+1

Это хранимая процедура, поэтому GO отсутствует. – FLICKER

+3

[Этот ответ] (http://dba.stackexchange.com/a/128866/361) в dba.se правильно объясняет проблему – Lamak

ответ

4

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

согласно documentation (в разделе Замечания),

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

Таким образом, вам либо придется использовать разные имена таблиц temp, либо вы должны сделать это за пределами хранимой процедуры и использовать GO.

+0

Полезно знать, я никогда не слышал об этом. Благодарю. – FLICKER

0

Иван Старостин является правильным. Я тестирую свой SQL этот TSQL, и он отлично работает.

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL 
DROP TABLE #uDims 
select top 10 * into #uDims from tblS 
go 
IF OBJECT_ID('tempdb..#uDims') IS NOT NULL 
DROP TABLE #uDims 
select top 10 * into #uDims from Waters 

без пробега. Я получаю ту же ошибку, что и вы (FLICKER).

+3

, но op сказал, что это находится внутри хранимой процедуры, поэтому он/она не может использовать 'GO' – Lamak

+0

Правильно, как я уже упоминал, это хранимая процедура. Логично и технически, ничего плохого в моем скрипте. это просто вопрос SSMS. SSMS пытается быть умным, но этого недостаточно, поскольку он не видит, что я отбросил таблицу перед «select into ...» – FLICKER

+0

@Flicker, вам нужно знать, почему вы получаете ошибку или как ее обходить? –

1

Для сценария, как говорили другие, используя GO, это исправление.

Однако, если это действительно код в хранимой процедуре, у вас есть другая проблема. Это не SSMS, который не любит синтаксис, это компилятор SQL. Он видит и задыхается над этими тремя операциями INSERT… INTO… и не достаточно умен, чтобы понять, что вы отбрасываете таблицу между операторами создания. (Даже если вы вынимаете операторы IF, у вас все еще возникает проблема.)

Исправление состоит в том, чтобы использовать разные имена таблиц temp. (Побочное преимущество, поскольку временная таблица основана на трех разных таблицах, это поможет уточнить, что структуры таблиц различны.) Если вас беспокоит избыточное пространство в памяти, вы все равно можете отбросить каждую временную таблицу, сделайте с ним.

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