选择进入临时表不能以单独的IF条件存在吗?

时间:2017-03-11 07:23:39

标签: sql-server sql-server-2008

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

IF @someCondition is not null
BEGIN
    SELECT * INTO #tempTable2 FROM Table; --No problem, no error
END
ELSE
BEGIN
    SELECT * INTO #tempTable2 FROM Table; --Execution failed
END
  

Msg 2714,Level 16,State 1,Line 197已经有一个名为的对象   '#tempTable2'在数据库中。

我可以知道上述情况可能是什么原因?在程序上,第一个IF部分中的查询没有被执行,因此它不应该创建#tempTable2

2 个答案:

答案 0 :(得分:1)

在创建具有相同名称的临时表的相同过程中,不能有两个语句。 这是SQL 6.5的剩余部分,它没有延迟的名称解析。

不使用select into,而是使用create table + insert

Answer by Erland Sommarskog on MSDN Social

if object_id('tempdb..#tempTable2') is not null
  drop table #tempTable2;

create table #tempTable2 (...);

if @someCondition is not null
begin
  insert into #tempTable2 
  select * from Table;
end
else
begin
    insert into #tempTable2 
    select * from Table;
end

答案 1 :(得分:0)

我希望你能理解我的英语倾诉。 问题不是"如果"但是"选择" 使用结构"从table1&#34中选择* into table2;将自动为ssms创建一个新表。 这意味着,当您在另一个时间使用相同的语句时,table2已在您的数据库中创建。 您不需要再次创建它,或者您可以使用其他名称创建它。