В базе данных уже есть объект с именем '##Temp

У меня есть хранимая процедура на SQL Server 2000. Он содержит:
select ... into ##Temp ...
...
drop table ##Temp

когда я запускаю хранимую процедуру с ADO во второй раз, он запрашивает:
в базе данных уже есть объект с именем '##Temp'.
Кто-нибудь может сказать мне, что случилось?

5 ответов


вы должны переписать сохраненный proc, чтобы удалить временную таблицу, если она существует, тогда у вас никогда не будет этой проблемы

IF (SELECT object_id('TempDB..##Temp')) IS NOT NULL
BEGIN
    DROP TABLE ##Temp
END

так как вы решили использовать глобальную временную таблицу ##Temp, он виден всем соединениям SQL в любой момент времени. Очевидно, что в то время как сохраненный proc работает для одного соединения, второе соединение приходит и пытается создать еще один ##Temp но это уже существует....

использовать соединение-local #Temp таблицы (только один ).


О, это все моя вина. Я позвонил SP дважды через одно соединение по ошибке.
Вот почему он всегда сообщает об ошибке при вызове во второй раз.
Конечно, вы этого не узнаете, прочитав мое описание. Извините, ребята...


для меня это решение работает :

IF (SELECT object_id ='#Temp') IS NOT NULL
BEGIN
   DROP TABLE #Temp
END

вы используете глобальную временную таблицу, как указано ## в начале имени таблицы. Это означает, что несколько сеансов могут получить доступ к таблице.

вероятно, у вас есть открытое соединение, которое создало таблицу, но не смогло ее удалить. Вы уверены, что первый запуск ADO действительно отбрасывает таблицу. Мог ли он потерпеть неудачу, или управление потоком в процедуре пропустило оператор drop?

может потребоваться протестировать процедуру в SQL Server Enterprise Manager чтобы увидеть, если он сообщает о каких-либо ошибок.