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

时间:2017-02-28 14:26:48

标签: sql-server stored-procedures temp-tables

在我的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

的临时表

这就是为什么我找不到它?有什么方法可以改变吗?这对我来说是新的......

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

尝试将您的操作包装在begin...end块中:

if object_id('tempdb..#MyTable') is null
begin
  create table #MyTable (
     Col1 int
   , Col2 varchar(10)
  );
end

答案 2 :(得分:0)

你的意思是使用IS NOT NULL我认为......这通常用于清除临时表,因此你不会得到你在OP中提到的错误。

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

答案 3 :(得分: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;