14

我在使用 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
4

4 回答 4

16

这是 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
于 2013-05-09T18:19:16.947 回答
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
于 2013-05-09T18:41:43.913 回答
0

据我了解,问题是这样的:

当您运行以下语句时,

SELECT * into #temp1 FROM CurrentMonthTbl

您正在动态创建一个临时表。

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

如果在您的情况下您已经创建了一个临时表,请尝试替换:

SELECT * into #temp1 FROM CurrentMonthTbl

和:

Insert into #temp1
    Select * from CurrentMonthTbl

还要看看数据库中已经有一个名为'##Temp'的对象

于 2013-05-09T18:27:12.473 回答
0

您可以在 if else 语句中使用实际表代替 #temp1 表。之后,您可以将数据从实际表插入临时表并删除实际表。

IF OBJECT_ID('tempdb..#temp1') is not null
    drop table #temp1

IF (select BusinessDayCount from Calendartbl) <= 1
BEGIN
    SELECT * into dbo.TempTable 
    FROM PreviousMonthTbl
END
ELSE
BEGIN
    SELECT * into dbo.TempTable
    FROM CurrentMonthTbl
END

select * into #temp1
from dbo.TempTable

IF OBJECT_ID('dbo.TempTable', 'U') is not null
    drop table dbo.TempTable
于 2021-09-01T06:53:59.823 回答