IF ... ELSE ...两个互斥的插入INTO #temptable

时间:2017-03-27 08:48:51

标签: tsql if-statement sql-server-2012 compiler-errors temp-tables

我需要将一组A或一组记录插入#temptable,具体取决于某些条件

我的伪代码:

IF OBJECT_ID('tempdb..#t1') IS NOT NULL DROP TABLE #t1;

IF {some-condition}
  SELECT {columns}
  INTO #t1 
  FROM {some-big-table}
  WHERE {some-filter}
ELSE
  SELECT {columns}
  INTO #t1
  FROM {some-other-big-table}
  WHERE {some-other-filter}

上面的两个SELECT是独占的(由ELSE运算符保证)。但是,SQL编译器试图超越我并抛出以下消息:

There is already an object named '#t1' in the database.

我“修复”这个想法是先创建#t1然后执行一个简单的INSERT INTO(而不是SELECT ... INTO)。但我喜欢极简主义,我想知道这是否可以通过更简单的方式实现,即没有明确的CREATE TABLE#t1。

顺便说一下,为什么它不会在第一行的条件DROP TABLE上给我一个错误?只是想知道。

2 个答案:

答案 0 :(得分:2)

在单个SQL批处理中,不能有2个具有相同名称的临时表。其中一篇MSDN文章称“如果在单个存储过程或批处理中创建了多个临时表,则它们必须具有不同的名称”。您可以使用2个不同的临时表或在IF-Else块之外声明的表变量/临时表来使用此逻辑。

答案 1 :(得分:0)

使用Dyamic sql我们可以处理这种情况。作为一名开发者,这不是一个好的做法。最好使用表变量或临时表。

IF 1=2
BEGIN
EXEC ('SELECT 1 ID INTO #TEMP1
SELECT * FROM #TEMP1
')
END
ELSE
EXEC ('SELECT 2 ID INTO #TEMP1
SELECT * FROM #TEMP1    
')