【发布时间】:2017-08-19 21:21:04
【问题描述】:
我需要根据特定条件将记录集 A 或记录集 B 插入#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 上没有给我一个错误?只是想知道。
【问题讨论】:
-
回答你最后一个问题;
DROP TABLE #t1只会在IF语句返回 true 时执行,即表存在。正如您所说的要简化,您可以将其重写为IF EXISTS(OBJECT_ID('tempdb..#t1')) DROP TABLE #t1;。 -
@PatrikBirgersson 我明白了!但是,我并不想知道如何简化那行特定的代码。更多的是关于无法在分支的 IF...ELSE 块中运行条件 SELECT ... INTO #temptable... 与能够在第一行中执行 #temptable 的条件 DROP 之间的不一致。 Rajesh 的回复打消了我所有的疑惑。
标签: tsql if-statement sql-server-2012 compiler-errors temp-tables