Использование 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.