Объект ошибки T-SQL существует при разделении на блоки if / else - PullRequest
0 голосов
/ 08 апреля 2010

Я получаю сообщение об ошибке: сообщение 2714, уровень 16, состояние 1, строка 16 В базе данных уже есть объект с именем "#mytemptable".

Есть способы обойти это, но удивляюсь, почему это происходит. Похоже, что SQL Server проверяет оба блока оператора if / else?

declare @choice int
select @choice = 1

if @choice = 1
    begin
        select 'MyValue = 1' AS Pick into #my_temp_table
    end
else
    begin
        select 'MyValue <> 1' AS Pick into #my_temp_table
    end

select * from #my_temp_table

drop table #my_temp_table

Если таблицы имеют разные имена, это работает. Или если я создаю временную таблицу и использую операторы Insert Into ..., которые также работают.

Ответы [ 2 ]

4 голосов
/ 08 апреля 2010

См. Здесь: Что такое отложенное разрешение имен и зачем вам нужно заботиться?

в основном вам нужно сначала сесть за стол

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

Вот еще один способ

 declare @choice int
    select @choice = 1

declare @Value varchar(100)
 if @choice = 1
 select @Value = 'MyValue = 1'
 else
 select @Value = 'MyValue <> 1'

    select @Value AS Pick into #my_temp_table
    select * from #my_temp_table

    drop table #my_temp_table
1 голос
/ 08 апреля 2010

Попробуйте это:

    declare @choice int
    select @choice = 1

CREATE TABLE     #my_temp_table(
Pick varchar(25)
)


    if @choice = 1
        begin
            INSERT INTO #my_temp_table 
              select 'MyValue = 1'
        end
    else
        begin
            INSERT INTO #my_temp_table 
                select 'MyValue <> 1'
        end

    select * from #temptable

    drop table #temptable

РЕДАКТИРОВАТЬ Извините, я вижу, что вы попробовали это, и вопрос был, ПОЧЕМУ это происходит. Это связано с тем, что SQL Server анализирует хранимую процедуру при ее создании и проверяет наличие конфликтов имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...