Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 数据库中已存在名为“columntable”的对象_Sql_Sql Server 2005_Tsql - Fatal编程技术网

Sql 数据库中已存在名为“columntable”的对象

Sql 数据库中已存在名为“columntable”的对象,sql,sql-server-2005,tsql,Sql,Sql Server 2005,Tsql,我正在尝试以下查询 if exists (select 1 from emp where eid = 6) begin if object_id('tempdb..#columntable') is not null begin drop table #columntable end

我正在尝试以下查询

   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
但是我得到了错误

Msg 2714, Level 16, State 1, Line 8
There is already an object named '#columntable' in the database.

有人能提出原因吗?如果我不编写else部分,同样的查询也可以正常工作。

只有在当前与数据库的连接断开或使用DROP TABLE columntable明确删除临时表时,才会在查询结束时自动删除临时表

要么在查询开始时测试表是否存在,要么总是在查询结束时删除表,最好两者都删除

编辑:正如Matrin在评论中所说,这实际上是一个解析错误。如果只在执行SQL时解析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

解析器对此很满意。有趣的是,如果您改为使用非临时表,原始查询将很好地解析,我意识到会产生问题,我只是想找出查询不解析的原因。

错误是错误的,删除if子句,它将通过fine运行。因此,问题在于存在:

if object_id('tempdb..#columntable') is not null
begin
    drop table #columntable
end 

create table #columntable (oldcolumns varchar(100))

您可以通过执行以下操作来检查它是否存在:

IF OBJECT_ID('tempdb..#columntable') IS NOT NULL
BEGIN
DROP TABLE #columntable
PRINT 'Dropped table...'
END
我得到了答案。。。 正如Martin所说,这是一个解析/编译问题。所以我试着改变我的脚本如下

  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
  go
 if exists (select 1  from emp where eid = 1)   
     begin
        if object_id('tempdb..#columntable') is not null 
          begin 
             drop table #columntable            
          end         
        create table #columntable (newcolumns varchar(100))   
     end

这对我来说很有效。

如果使用SELECT INTO…创建表,也会出现这种情况,如中所示

IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL
    DROP TABLE #MyTempTable
SELECT TOP 1 @MyVariable = ScaleValue
    FROM MyDataTable1
    WHERE ProductWeight > 1000
IF @MyVariable = 1
BEGIN
    SELECT KeyNm
        INTO #MyTempTable
        FROM dbo.MyDataTable2
        WHERE CatNum = 2
END
ELSE
BEGIN
    SELECT KeyNm
        INTO #MyTempTable
        FROM dbo.MyDataTable2
        WHERE CatNum = 8
END
解析器甚至不应该尝试检测这一点,因为在许多情况下,解析器不可能确定表是否已经存在。上面的代码是一个完美的例子……解析器无法确定@MyVariable的值。
我希望有人告诉MS这个错误,我没有他们的耳朵。

使用全局临时表并将select封装在exec中

例如:

失败

这将愚弄试图比它更聪明的错误解析器。
和Microsoft-请修复此问题。

不幸的是,这是一个SQL Server解析器错误

@DizGrizz也是右键选择。。如果在if中重复,则进入某个表不起作用。。其他声明

如果其他的创建一个有吸引力的表 在回答实际问题时,创建然后更改表也可以工作,您只需检查并删除一次

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
如果其他的选择一些有诱惑力的东西 然而,我遇到的问题与@DizGrizz:IF。。ELSE与SELECT组合。。进入某个表格失败。作为一种解决方法,可以选择前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

我一直在经历这个问题。我的查询由以下形式的几个连接的SELECT语句组成:

DROP TABLE IF EXISTS ##TempTableName

SELECT statement ...
因此,每次我试图修改SQL代码时,都会出现上述错误。我已经将所有临时表从全局表更改为本地表,现在我可以根据需要多次更改SQL。因此,上述示例将变成:

DROP TABLE IF EXISTS #TempTableName

SELECT statement ...

的确这就是我所想的。@crokusek-我不确定你在评论什么,我说这个查询是作为一个测试来分割的,以避免出现错误。您是说SQL Server 2012对查询的解释不同吗?根据@marc_s的说法,临时表被丢弃在存储过程的末尾。这与你在这里所说的相矛盾。哪一个是正确的?@BlueRaja DannyPflughoeft-在某种程度上,我们都是正确的:执行一个过程会导致任何临时表在结束时被删除。我指的是在ManagementStudio中打开一个交互式会话,其中存在临时表,直到您关闭连接。如果要使用Management Studio中的查询窗口执行过程,则在过程完成后,在该过程中创建的临时对象将不可用,即使您仍与数据库有连接。Woops,同时发布:\n表不存在。这是一个解析/编译问题,因为它遇到了两个CREATE语句。这听起来很合理。那么,有没有一种方法可以实现同样的功能呢。那么解决办法是什么呢?@BlueRaja-Danny pflughoft我也这么想有关答案,请参阅我的帖子。问题是在IF和ELSE语句中创建临时表,而不是EXISTS的问题。是否有指向Microsoft网站的工作链接,他们在那里承认这是一个问题?看起来他们移动了原版page@Alex我认为Microsoft会删除旧的知识库文章,这意味着您无法再找到详细信息:-/
DROP TABLE IF EXISTS ##TempTableName

SELECT statement ...
DROP TABLE IF EXISTS #TempTableName

SELECT statement ...