Таблица «уже существует» после удаления, если существует

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

По сути это выглядит так:

;IF EXISTS(SELECT * FROM sys.tables WHERE SCHEMA_NAME(schema_id) LIKE 'dbo' AND name like '#MYTEMPTABLE')
DROP TABLE #MYTEMPTEBLE;

WITH cte AS ...
SELECT * INTO #MYTEMPTABLE FROM cte
SELECT * FROM #MYTEMPTABLE WHERE [conditions]
DROP TABLE #MYTEMPTABLE;

Однако я получаю сообщение об ошибке о том, что объект с именем #MYTEMPTABLE уже существует в базе данных после вызова с ошибкой (что весьма вероятно, если заказчик/тестер испортит некоторые данные).

Если вы не запустите этот запрос в tempdb, то этот IF никогда не будет истинным. Временные таблицы не создаются в базе данных, к которой вы подключены, они создаются в tempdb.

Larnu 18.03.2022 09:36

@Larnu спасибо, знание причины очень полезно для запоминания решения. Я никогда не знал, что они были созданы в tempdb.

Infrisios 18.03.2022 09:48

Точка с запятой — это оператор терминатор. Используйте его последовательно, и вам никогда не понадобится ленивый кладж, чтобы использовать его как «новичок». Здесь это бесполезно перед первым утверждением.

SMor 18.03.2022 12:36
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
48
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это может DROP TABLE не выполнить ваше условие проверки, оно может проверить из TempDB.INFORMATION_SCHEMA.COLUMNS таблицы вместо sys.tables таблицы

SELECT * FROM TempDB.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME IN (
 SELECT NAME 
 FROM TempDB.SYS.TABLES 
 WHERE OBJECT_ID=OBJECT_ID('TempDB.dbo.#MYTEMPTEBLE')
);

sqlfiddle

Если версия вашего SQL-сервера была выше 2016 года, вы можете попробовать использовать DROP TABLE IF EXISTS

DROP TABLE IF EXISTS #MYTEMPTEBLE;
WITH cte AS ...
SELECT * INTO #MYTEMPTABLE FROM cte
SELECT * FROM #MYTEMPTABLE WHERE [conditions]

если ваша версия SQL-сервера не поддерживает это, вы можете проверить, OBJECT_ID IS NOT NULL какая временная таблица представлена ​​в вашей системе.

IF OBJECT_ID('TempDB..#MYTEMPTEBLE') IS NOT NULL
DROP TABLE #MYTEMPTEBLE;

К сожалению, мы используем SQL 2016 :( Обновлено: Но разве это не должно быть ЕСЛИ СУЩЕСТВУЕТ в любом случае вместо ЕСЛИ НЕ СУЩЕСТВУЕТ? Кажется, это работает с этим.

Infrisios 18.03.2022 09:26

@Infrisios Хорошо, я даю вам несколько разных ответов и DROP TABLE IF EXISTS поддержку на sqlserver 2016.

D-Shih 18.03.2022 09:32

Другие вопросы по теме