Использование IF/ELSE для определения оператора SELECT INTO
У меня возникают некоторые странные проблемы с использованием IF/ELSE, чтобы определить, какие из двух операторов SELECT выполнить. Сообщение об ошибке, которое я получаю при запуске полного оператора, состоит в том, что моя временная таблица уже существует, но это не происходит, если я запускаю два отдельных исполнения двух отдельных операторов IF.
Вот код в SQL Server:
IF (select BusinessDayCount from Calendartbl) <= 1
BEGIN
SELECT * into #temp1
FROM PreviousMonthTbl
END
ELSE
BEGIN
SELECT * into #temp1
FROM CurrentMonthTbl
END
Ответы
Ответ 1
Это "функция" проверки синтаксиса в SQL Server. Вы просто не можете "создать" #temporary таблицу дважды в пределах одной партии.
Это шаблон, который вам нужен.
SELECT * into #temp1
FROM PreviousMonthTbl
WHERE 1=0;
IF (select BusinessDayCount from Calendartbl) <= 1
BEGIN
INSERT into #temp1 SELECT *
FROM PreviousMonthTbl
END
ELSE
BEGIN
INSERT into #temp1 SELECT *
FROM CurrentMonthTbl
END
Если вы предпочитаете, вы также можете выразить ветвь (в данном случае) как предложение WHERE:
SELECT * into #temp1
FROM PreviousMonthTbl
WHERE (select BusinessDayCount from Calendartbl) <= 1
UNION ALL
SELECT *
FROM CurrentMonthTbl
WHERE isnull((select BusinessDayCount from Calendartbl),2) > 1
Ответ 2
Вы не можете использовать SELECT INTO для таблиц с одинаковым именем в той же партии. Использовать другое имя для временной таблицы
IF EXISTS(
SELECT 1
FROM Calendartbl
WHERE BusinessDayCount <= 1
)
BEGIN
IF OBJECT_ID('tempdb.dbo.#PreviousMonthTbl') IS NULL DROP TABLE dbo.#PreviousMonthTbl
SELECT *
INTO #PreviousMonthTbl
FROM PreviousMonthTbl
END
ELSE
BEGIN
IF OBJECT_ID('tempdb.dbo.#CurrentMonthTbl') IS NULL DROP TABLE dbo.#CurrentMonthTbl
SELECT *
INTO #CurrentMonthTbl
FROM CurrentMonthTbl
END
Ответ 3
Из чего я понимаю, проблема такова:
Когда вы запустите инструкцию ниже,
SELECT * into #temp1 FROM CurrentMonthTbl
вы создаете временную таблицу на лету.
Если перед этой строкой у вас был оператор create table, то этот оператор Select in будет терпеть неудачу, потому что таблица уже существует.
Если в вашем случае у вас уже создана временная таблица, попробуйте заменить:
SELECT * into #temp1 FROM CurrentMonthTbl
с:
Insert into #temp1
Select * from CurrentMonthTbl
Также смотрите В базе данных уже есть объект с именем # # Temp.