我有一个查询,我从表中插入一些值:
SELECT ID, NAME INTO #tmpTable1
FROM TableOriginal
首次执行没问题,如果我在MSSMS(Microsoft Sql Server Management Studio)中按F5(运行),则发生错误:
Msg 2714,Level 16,State 6,Line 4
数据库中已经存在名为“#tmpTable1”的对象。
好。我决定在使用以下内容从TableOriginal
向#tmpTable1
插入数据之前进行检查:
IF OBJECT_ID('tempdb.#tmpTable1') IS NOT NULL
DROP TABLE #tmpTable1
不工作,错误再次显示如上。
我在tempdb
数据库中看到了以下临时表名:
dbo.#tmpTable1__________________0000007
为什么呢?每次创建临时表(使用第一个查询)时,表名都将在MSSMS中自动生成?
如何删除现有临时表以使用新值执行新表?
答案 0 :(得分:54)
你很近 - 你需要在支票中使用两个点:
IF OBJECT_ID('tempdb..#tmpTable1') IS NOT NULL
**
|
use two dots here!
基本上,这就是说:检查tempDB
并且我不关心表中的模式
正如Joe所说:这不是100%正确:它不会检查每个架构 - 它只会检查默认所有者的架构 - 通常是dbo
。所以这也可行:
IF OBJECT_ID('tempdb.dbo.#tmpTable1') IS NOT NULL
如果您碰巧在默认所有者以外的架构中创建对象,则需要明确指定您所指的架构。但是tempDB
中的临时表确实是在dbo
模式中创建的。
答案 1 :(得分:9)
这不是问题的答案,只是想在引用#temp表时临时发布关于放置.dbo.
与..
的位的回复。
我找不到让#temp表实际上由除dbo以外的任何东西所拥有的方法。试试吧:
CREATE SCHEMA blat;
GO
CREATE TABLE blat.#pound(id INT);
GO
SELECT
OBJECT_ID('tempdb..#pound'),
OBJECT_ID('tempdb.dbo.#pound'),
OBJECT_ID('tempdb.blat.#pound');
USE tempdb;
GO
SELECT [object_id], SCHEMA_NAME([schema_id])
FROM sys.objects
WHERE name LIKE '#pound%';
结果:
-1222354987 -1222354987 -1222354987
-1222354987 dbo
这是在SQL Server 2012上。我在SQL Server 2005上对此进行了测试,唯一的区别是object_id值为正。我也尝试过:
blat
blat.#pound
blat
在所有三种情况下,都取得了与上述相同的结果。
您也不能在不同的模式中创建两个具有相同名称的#temp表:
CREATE TABLE blat.#flab(id INT);
CREATE TABLE dbo.#flab(id INT);
结果:
Msg 2714,Level 16,State 6 数据库中已经有一个名为'#flab'的对象。
这不是解析问题(就像许多#temp表问题一样);您可以单独运行这两个语句并收到相同的错误。
所以,这是一种冗长的说法,你不需要在解析#temp表名时指定模式,它总是在dbo
下创建,并且至少在{{ {1}}将忽略您指定的模式(OBJECT_ID
在#tempdb的上下文中运行时始终返回OBJECT_SCHEMA_NAME
,但不会在任何其他数据库中运行。如果您尝试在dbo
中查询schema_id
,则所有投注均已关闭。
答案 2 :(得分:1)
CREATE TABLE #temptable (col1 int);
GO
INSERT INTO #temptable
VALUES (10);
GO
SELECT * FROM #temptable;
GO
IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT NULL
DROP TABLE #temptable;
GO
--Test the drop.
SELECT * FROM #temptable;
答案 3 :(得分:0)
只要创建它的连接打开,就会存在定义该方式的临时表。通常不需要检查它是否存在或者手动丢弃它,因为你在连接中有完全的控制权,但如果你真的需要检查它,你可以检查tempdb.dbo。#tempTable。
答案 4 :(得分:-1)
IF OBJECT_ID(' tempdb.dbo。#tmpTable1%')IS NOT NULL :)