【问题标题】:Using IF / ELSE to determine a SELECT INTO statement使用 IF/ELSE 确定 SELECT INTO 语句
【发布时间】:2013-05-09 18:11:46
【问题描述】:

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

【问题讨论】:

  • 您应该在此问题中添加 SQL Server 或 T-SQL 标记。我想你会得到更好/更多的回应。
  • PreviousMonth 和 CurrentMonth 是否具有相同的结构?
  • 当前月份和上个月应该具有相同的结构。我在这里对其进行了简化以显示问题,但它们都代表同一个表的子查询,因为以前我正在为表做一个 min(date) 并重新加入它,对于当前我正在做 max(date)表并加入回它。是一个表格,保存了本月和上月的数据,这里的[date]代表每一行数据对应的月份。

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


【解决方案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

【讨论】:

  • 啊,我明白了。它希望表已经存在并被更新。感谢您的帮助!
  • 问题是 SQL Server 不能确定这两个“创建”在 IF 的不同分支中(即使这样,您实际上也可以使用 label:s 来实际运行两者!)。因此,它得出的结论是你试图创建它两次并抱怨。上述两种解决方案都解决了这个问题。
  • 如果您选择第一种方法,您将需要一个 Create Table #temp1 语句。
  • @fahed 注意SELECT..INTO #temp1
  • 您可以使用动态 sql 来伪造它。但是,您必须使用全局临时表才能查看表中的内容。
【解决方案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 into 语句将失败,因为该表已经存在。

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

    SELECT * into #temp1 FROM CurrentMonthTbl
    

    与:

    Insert into #temp1
        Select * from CurrentMonthTbl
    

    也看There is already an object named '##Temp' in the database

    【讨论】:

    • 看了一下,下面的答案是正确的,特别是关于sql server如何看到两个同名表正在创建的评论,忽略了创建表的条件是互斥的事实.
    【解决方案4】:

    您可以在 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
    

    【讨论】:

      猜你喜欢
      • 2014-02-15
      • 2012-11-11
      • 2014-11-03
      • 1970-01-01
      • 2019-04-09
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多