使用IF / ELSE确定SELECT INTO语句

时间:2013-05-09 18:11:47

标签: sql sql-server database tsql if-statement

我遇到一些奇怪的问题,使用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

3 个答案:

答案 0 :(得分:12)

这是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

答案 1 :(得分:1)

对于同一批次中具有相同名称的表,不能使用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

答案 2 :(得分:0)

据我所知,问题是:

当您运行以下语句时,

SELECT * into #temp1 FROM CurrentMonthTbl

您正在动态创建临时表。

如果在该行之前有一个create table语句,那么这个Select into语句将失败,因为该表已经存在。

如果您已经创建了临时表,请尝试替换:

SELECT * into #temp1 FROM CurrentMonthTbl

使用:

Insert into #temp1
    Select * from CurrentMonthTbl

另请参阅There is already an object named '##Temp' in the database