Tsql 如果。。。其他的两个相互排斥的插入到#诱惑

Tsql 如果。。。其他的两个相互排斥的插入到#诱惑,tsql,if-statement,sql-server-2012,compiler-errors,temp-tables,Tsql,If Statement,Sql Server 2012,Compiler Errors,Temp Tables,我需要将记录集A或记录集B插入A#tentable,具体取决于特定条件 我的伪代码: 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

我需要将记录集A或记录集B插入A#tentable,具体取决于特定条件

我的伪代码:

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,然后执行一个简单的插入(而不是选择…插入)。但我喜欢极简主义,我想知道是否可以用一种更简单的方法实现这一点,即不需要预先显式地创建TABLE#t1


顺便问一下,为什么它没有在第一行的条件删除表上给我一个错误?只是想知道。

在一个SQL批处理中不能有两个同名的临时表。MSDN的一篇文章说“如果在单个存储过程或批处理中创建了多个临时表,那么它们必须有不同的名称”。您可以将此逻辑与两个不同的临时表或在IF-Else块外部声明的表变量/temp-table一起使用。

在一个SQL批处理中不能有两个同名的临时表。MSDN的一篇文章说“如果在单个存储过程或批处理中创建了多个临时表,那么它们必须有不同的名称”。您可以将此逻辑与两个不同的临时表或在IF-Else块外声明的表变量/temp-table一起使用。

使用动态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    
')

使用动态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    
')

回答你的最后一个问题;只有当
if
-语句返回true(即该表存在)时,才会执行
DROP TABLE#t1
。正如您所说的要简化,您可以将其重新写入
(如果存在)(OBJECT_ID('tempdb..t1'))DROP TABLE#t1@PatrikBirgersson我明白了!然而,我并不想知道如何简化这一行代码。这更多的是关于无法运行条件选择之间的不一致性。。。进入#诱人的。。。在分支的IF…ELSE块中,与能够在第一行有条件地删除a#tentable相比。拉杰什的回答澄清了我所有的疑问;只有当
if
-语句返回true(即该表存在)时,才会执行
DROP TABLE#t1
。正如您所说的要简化,您可以将其重新写入
(如果存在)(OBJECT_ID('tempdb..t1'))DROP TABLE#t1@PatrikBirgersson我明白了!然而,我并不想知道如何简化这一行代码。这更多的是关于无法运行条件选择之间的不一致性。。。进入#诱人的。。。在分支的IF…ELSE块中,与能够在第一行有条件地删除a#tentable相比。Rajesh的回答消除了我在这里的所有疑问。谢谢,这肯定会在一定程度上起作用,即它将填充#temp,然后返回其所有行。但是,我在后续查询中使用了#temp表,这使得您的方法不适合我的情况。最后,我先创建了一个#temp表,然后用INSERT-INTO填充它……谢谢,这肯定会在某一点上起作用,即它会填充#temp,然后返回它的所有行。但是,我在后续查询中使用了#temp表,这使得您的方法不适合我的情况。最后,我先创建了一个临时表,然后用INSERT INTO填充它。。。