SQL Server - 如果不存在则创建临时表

5
在我的SQL Server 2012环境中,我已经创建了一系列存储过程,它们之间传递预先存在的临时表(我尝试了不同的架构,但由于需求/程序的性质无法绕过这个问题)。
我想要做的是,在存储过程内部检查是否已经创建了一个临时表,如果没有,则创建它。
我的当前SQL代码如下:
IF OBJECT_ID('tempdb..#MyTable') IS NULL
    CREATE TABLE #MyTable
    (
        Col1 INT,
        Col2 VARCHAR(10)
        ...
    );

但是,当我尝试在表已经存在时运行它时,我会得到以下错误信息:

数据库中已经存在一个名为“#MyTable”的对象

因此,它似乎不会简单地忽略 If 语句中的那些行。

有没有办法完成这个目标 - 如果临时表不存在,则创建它;否则,使用内存中已经存在的表?

谢谢!

更新:

出于某种原因,按照@RaduGheorghiu在评论中的建议,我发现系统创建了一个名称类似于 dbo.#MyTable________________________________________________0000000001B1 的临时表。

那是我找不到它的原因吗?有没有办法改变它?这对我来说是新的....


@RaduGheorghiu,如果您将此代码放入会话窗口中,并在其之前简单地创建临时表,则会出现我所指的错误。我遇到的问题是,如果临时表事先存在,If语句似乎没有任何区别,您将会得到一个错误,而我不希望发生这种情况。 - John Bustos
非常抱歉,我无法重现您的问题。我已经运行了 create table #MyTable (col1 int); 然后多次运行了 IF OBJECT_ID('tempdb..#MyTable') IS NULL CREATE TABLE #MyTable ( Col1 INT ); 但是我没有收到任何错误信息。 - Radu Gheorghiu
1
让我们在聊天中继续这个讨论 - Radu Gheorghiu
1
他们在这里遇到了一些类似的问题... http://weblogs.sqlteam.com/mladenp/archive/2008/08/21/SQL-Server-2005-temporary-tables-bug-feature-or-expected-behavior.aspx - manderson
@manderson,太好了!-我必须使用GO语句,然后一切都正常了...请将此作为答案发布,它修复了问题,这似乎是SQL Server的一个错误。 - John Bustos
显示剩余4条评论
4个回答

2

这个答案可能解决问题,但是在问题评论中引用的此处聊天记录对我更有帮助。 - Jed

1

我认为你想使用IS NOT NULL...这通常用于清除临时表,以便在操作过程中不会出现你在原始帖子中提到的错误。

IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL DROP TABLE #MyTable
CREATE TABLE #MyTable
(
    Col1 INT,
    Col2 VARCHAR(10)
);

大的区别在于逻辑检查后使用了DROP TABLE语句。此外,创建表格时不填充数据并不会使其变为NULL
DROP TABLE #MyTable

CREATE TABLE #MyTable
(
    Col1 INT,
    Col2 VARCHAR(10)
);

IF OBJECT_ID('tempdb..#MyTable') IS NOT NULL 
SELECT 1

@JohnBustos 如果它存在,您是否期望它已经有数据了? - S3S
是的,我只想插入额外的行 - 这就是我想要它的原因... - John Bustos

0

这看起来很奇怪,但当我尝试时它确实有效

IF(OBJECT_ID('tempdb..#Test') IS NULL) --check if it exists
  BEGIN
    IF(1 = 0)--this will never actually run, but it tricks the parser into allowing the CREATE to run
        DROP TABLE #Test;

    PRINT 'Create table';

    CREATE TABLE #Test
    (
        ID  INT NOT NULL PRIMARY KEY
    );
  END

IF(NOT EXISTS(SELECT 1 FROM #Test))
    INSERT INTO #Test(ID)
    VALUES(1);

SELECT *
FROM #Test;

--Try dropping the table and test again
--DROP TABLE #Test;

0
尝试将你的操作放在一个begin...end块中:
if object_id('tempdb..#MyTable') is null
begin
  create table #MyTable (
     Col1 int
   , Col2 varchar(10)
  );
end

尝试过了 - 仍然不行 :/ - John Bustos
我也更新了我的问题 - 当我创建临时表时,数据库似乎在做一些不同的事情。当我检查它时,我发现创建的表以dbo.#MyTable________________________________________________0000000001B1命名,原因不明。 - John Bustos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接