DROP TABLE не выполняется для временной таблицы - PullRequest
5 голосов
/ 15 апреля 2010

У меня есть клиентское приложение, которое создает временную таблицу, выполняет массовую вставку в временную таблицу, а затем выполняет некоторый SQL с использованием этой таблицы перед ее удалением.

Псевдо-код:

open connection
begin transaction
CREATE TABLE #Temp ([Id] int NOT NULL)
bulk insert 500 rows into #Temp
UPDATE [OtherTable] SET [Status]=0 WHERE [Id] IN (SELECT [Id] FROM #Temp) AND [Group]=1
DELETE FROM #Temp WHERE [Id] IN (SELECT [Id] FROM [OtherTable] WHERE [Group]=1)
INSERT INTO [OtherTable] ([Group], [Id]) SELECT 1 as [Group], [DocIden] FROM #Temp

DROP TABLE #Temp
COMMIT TRANSACTION
CLOSE CONNECTION

Это происходит с ошибкой в ​​операторе DROP:

Невозможно удалить таблицу '#Temp', поскольку она не существует или у вас нет разрешения.

Я не могу себе представить, как этот сбой мог произойти, если раньше ничего не происходило, но я не вижу других сбоев, происходящих до этого.

Есть ли что-то, что я пропускаю, что может быть причиной этого?

Ответы [ 4 ]

7 голосов
/ 15 апреля 2010

Я проверил это на SQL Server 2005, и вы можете удалить временную таблицу в транзакции, которая его создала:

begin transaction
create table #temp (id int)
drop table #temp
commit transaction

Какую версию SQL Server вы используете?

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

Глобальная временная таблица начинается с двойного хеша (например, ##MyTable.) Но даже глобальная временная таблица автоматически удаляется, когда к ней не обращается ни одно соединение.

7 голосов
/ 15 апреля 2010

возможно, что-то происходит в промежутке между сеансами?

Попробуйте проверить наличие таблицы до ее удаления:

IF object_id('tempdb..#Temp') is not null
BEGIN
   DROP TABLE #Temp
END
2 голосов
/ 17 мая 2014
BEGIN TRAN

IF object_id('DATABASE_NAME..#TABLE_NAME') is not null
BEGIN
   DROP TABLE #TABLE_NAME
END

COMMIT TRAN

Примечание: Пожалуйста, введите имя вашей таблицы, где TABLE_NAME и имя базы данных, где написано DATABASE_NAME

2 голосов
/ 15 апреля 2010

Я думаю, вы вообще не создаете таблицу, потому что утверждение

CREATE TABLE #Temp ([Id] AS int)

неверно. Пожалуйста, напишите это как

CREATE TABLE #Temp ([Id] int)

и посмотрите, работает ли он.

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