在我的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
这就是为什么我找不到它?有什么方法可以改变吗?这对我来说是新的......
答案 0 :(得分:2)
好像你需要使用GO语句。
答案 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;