В базе данных уже есть объект с именем ## Temp - PullRequest
13 голосов
/ 13 августа 2010

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

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

Ответы [ 5 ]

23 голосов
/ 13 августа 2010

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

IF (SELECT object_id('TempDB..##Temp')) IS NOT NULL
BEGIN
    DROP TABLE ##Temp
END
1 голос
/ 13 августа 2010

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

Вместо этого используйте локальные #Temp таблицы соединений (только одна #).

1 голос
/ 13 августа 2010

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

0 голосов
/ 26 октября 2016

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

IF (SELECT object_id ='#Temp') IS NOT NULL
BEGIN
   DROP TABLE #Temp
END
0 голосов
/ 13 августа 2010

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

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

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

...