Команды удаления в таблицах #temp не сохраняются до фиксации, если они включены в транзакцию? - PullRequest
0 голосов
/ 09 мая 2019

Я объединил кучу SQL-скриптов, которые используют одно и то же имя временной таблицы #Temp. Никаких дополнительных CREATE TABLE #Temp команд нет, и каждому SELECT INTO #Temp соответствует DROP TABLE #Temp.

Форматируется так:

SELECT myfield1, myfield2 INTO #Temp FROM MyTable

--Do stuff with #Temp

DROP TABLE #Temp

SELECT myfield3, myfield4 INTO #Temp FROM MyTable2

--Do stuff with #Temp

DROP TABLE #Temp

Все упаковано в один TRY и TRANSACTION. Итак, первые две строки всего сценария:

BEGIN TRY
  BEGIN TRANSACTION

Я получаю эту ошибку: There is already an object named '#Temp' in the database.

Это потому, что, хотя я и выполняю команду DROP, она не происходит, пока транзакция не завершится, что вызвало ошибку?

Является ли мой единственный вариант создания # Temp1, # Temp2 и т. Д.?

Ответы [ 2 ]

3 голосов
/ 09 мая 2019

Это ошибка времени компиляции. Когда код компилируется, SQL Server видит два объявления для #temp

Самое простое решение - использовать разные имена для временных таблиц.

2 голосов
/ 09 мая 2019

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

SELECT myfield1, myfield2 INTO #Temp FROM MyTable

PRINT N'Created the table'
--Do stuff with #Temp

DROP TABLE #Temp

PRINT N'Dropped the table'

SELECT myfield3, myfield4 INTO #Temp FROM MyTable2

PRINT N'Created the table again'
--Do stuff with #Temp

DROP TABLE #Temp

PRINT N'Dropped the table again'

Хотя (в моем случае) MyTable не существует, я все равно получаю сообщение об ошибке:

Сообщение 2714, уровень 16, состояние 1, строка 10
В базе данных уже есть объект с именем #Temp.

Это потому, что в одной и той же партии вы пытаетесь создать одну и ту же таблицу дважды. На самом деле я знаю, что #temp никогда не создавался (как это не могло быть из-за того, что MyTable не существовал). Кроме того, операторы PRINT не выполнялись, показывая, что ничего не предпринималось.

Разделите операторы на 2 пакета, и все будет работать нормально.

SELECT myfield1, myfield2 INTO #Temp FROM MyTable

PRINT N'Created the table'
--Do stuff with #Temp

DROP TABLE #Temp

PRINT N'Dropped the table'
GO

SELECT myfield3, myfield4 INTO #Temp FROM MyTable2

PRINT N'Created the table again'
--Do stuff with #Temp

DROP TABLE #Temp

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