数据库中已经有一个名为"#columntable"的对象

Moh*_*eem 8 sql t-sql sql-server-2005

我正在尝试以下查询

   if exists (select 1  from emp where eid = 6)     
     begin
        if object_id('tempdb..#columntable') is not null 
          begin 
             drop table #columntable                         
          end                     
        create table #columntable (oldcolumns varchar(100))   
     end
  else
     begin
        if object_id('tempdb..#columntable') is not null 
          begin 
             drop table #columntable            
          end     


    create table #columntable (newcolumns varchar(100))   
 end
Run Code Online (Sandbox Code Playgroud)

但是我收到了错误

Msg 2714, Level 16, State 1, Line 8
There is already an object named '#columntable' in the database.
Run Code Online (Sandbox Code Playgroud)

谁有人建议为什么?如果我不写else部分,相同的查询工作正常.

Sha*_*rpC 7

遗憾的是,这是一个SQL Server解析器错误(由Microsoft确认).

@DizGrizz也是对的 - SELECT .. INTO #SomeTable如果在IF .. ELSE语句中重复,则不起作用.


IF .. ELSE .. CREATE TABLE #SomeTempTable

在回答实际问题时,创建然后改变表工作(你也只需要检查和删除一次)...

IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL
BEGIN 
     DROP TABLE #MyTempTable
END  

CREATE TABLE #MyTempTable (DummyColumn BIT)

IF EXISTS (SELECT 1 FROM EMP WHERE EID = 6)     
    BEGIN
        ALTER TABLE #MyTempTable
        ADD MyColumnType1 VARCHAR(100)

        ALTER TABLE #MyTempTable
        DROP COLUMN DummyColumn
    END
ELSE
    BEGIN
        ALTER TABLE #MyTempTable 
        ADD MyColumnType2 VARCHAR(100)

        ALTER TABLE #MyTempTable
        DROP COLUMN DummyColumn
    END
Run Code Online (Sandbox Code Playgroud)


IF .. ELSE .. SELECT INTO #SomeTempTable

然而,我遇到的问题与@DizGrizz相同:IF .. ELSE结合SELECT .. INTO #SomeTable失败.作为一种解决方法,可以选择前0行(即无)来创建具有正确列类型的表.(这会使脚本与列类型更改隔离,并且还可以避免声明每种类型的痛苦.) INSERT INTO然后可以使用,前提IDENTITY_INSERT是设置ON为防止错误:

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

-- This creates the table, but avoids having to declare any column types or sizes
SELECT TOP 0 KeyNm
INTO #MyTempTable
FROM dbo.MyDataTable2

-- Required to prevent IDENTITY_INSERT error
SET IDENTITY_INSERT #MyTempTable ON

IF @something = 1
    BEGIN
        -- Insert the actual rows required into the (currently empty) temp table
        INSERT INTO #MyTempTable (KeyNm)
        SELECT KeyNm
        FROM dbo.MyDataTable2
        WHERE CatNum = 2
    END
ELSE
    BEGIN
        -- Insert the actual rows required into the temp table
        INSERT INTO #MyTempTable (KeyNm)
        SELECT KeyNm
        FROM dbo.MyDataTable2
        WHERE CatNum = 8
    END

SET IDENTITY_INSERT #MyTempTable OFF
Run Code Online (Sandbox Code Playgroud)


Ton*_*ony 6

只有在删除当前与DB的连接或您明确删除它们时,才会在查询结束时自动删除临时表 DROP TABLE #columntable

要么在查询开始时测试表的存在,要么在结束时删除它(最好是两者)

编辑:正如Matrin在评论中所说,这实际上是一个解析错误.如果只在执行时解析SQL,则会出现相同的错误.

为了测试它我分解你的查询并尝试:

if exists (select 1 from emp where id = 6)
  create table #columntable (newcolumns varchar(100))
GO
if not exists (select 1 from emp where id = 6)
  create table #columntable (oldcolumns varchar(100))
GO
Run Code Online (Sandbox Code Playgroud)

解析器很满意.有趣的是,如果你改为使用非临时表,原始查询解析得很好(我意识到会产生的问题,我只是想知道查询无法解析的原因).