0

我需要记录的任一组A或集合B插入到#temptable,根据一定的条件IF ... ELSE ...两个相互排斥的插入到#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} 

上述两个选择是独占的(由ELSE运算符保证)。但是,SQL编译器试图智取我并抛出以下消息:

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

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

顺便说一句,为什么它不给我在第一行条件DROP TABLE错误?就是想。

+1

要回答你最后一个问题;只有'IF'语句返回true时,才会执行DROP TABLE#t1,即表存在。正如你所说的你想简化,你可以把它重写为'IF EXISTS(OBJECT_ID('tempdb ..#t1'))DROP TABLE#t1;'。 –

+0

@PatrikBirgersson我明白了!但是,我并不想知道如何简化这一行代码。更多的是关于不能在分支IF ... ELSE块中运行条件SELECT ... INTO #temptable ...与能够在第一行中执行#temptable的条件DROP之间的不一致之处。拉杰什的回答清除了我所有的疑虑。 –

回答

2

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

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  
') 
+0

谢谢,这肯定会工作到某一点,即它会填充#temp,然后返回其所有行。但是,我在随后的查询中使用#temp表,这使得您的方法不适合我的情况。我最终创建了一个#temp表,并用INSERT INTO填充它... –