Я получил довольно сложный 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 уже существует в базе данных после вызова с ошибкой (что весьма вероятно, если заказчик/тестер испортит некоторые данные).
@Larnu спасибо, знание причины очень полезно для запоминания решения. Я никогда не знал, что они были созданы в tempdb.
Точка с запятой — это оператор терминатор. Используйте его последовательно, и вам никогда не понадобится ленивый кладж, чтобы использовать его как «новичок». Здесь это бесполезно перед первым утверждением.


Это может 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')
);
Если версия вашего 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 Хорошо, я даю вам несколько разных ответов и DROP TABLE IF EXISTS поддержку на sqlserver 2016.
Если вы не запустите этот запрос в
tempdb, то этотIFникогда не будет истинным. Временные таблицы не создаются в базе данных, к которой вы подключены, они создаются вtempdb.