繁体   English   中英

如何正确检查SQL Server 2005中是否存在临时表?

[英]How to check correctly if a temporary table exists in SQL Server 2005?

我有一个查询,我从表中插入一些值:

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中自动生成?

如何删除现有临时表以使用新值执行新表?

你很近 - 你需要在支票中使用两个点:

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模式中创建的。

这不是问题的答案,只是想暂时发布关于.dbo. vs. ..引用#temp表时。

我找不到让#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值为正。 我也尝试过:

  • 实际存在于tempdb中的模式,称为blat
  • table 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下创建,至少在OBJECT_ID下的解析将忽略你指定的模式( OBJECT_SCHEMA_NAME在#tempdb的上下文中运行时也总是返回dbo ,但在任何其他数据库中都没有。 所有的赌注都关闭,如果你尝试查询schema_idtempdb.sys.objects

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;

只要创建它的连接打开,就会存在以这种方式定义的临时表。 通常不需要检查它是否存在或者手动丢弃它,因为你在连接中有完全的控制权,但如果你真的需要检查它,你可以检查tempdb.dbo。#tempTable。

IF OBJECT_ID('tempdb.dbo。#tmpTable1%')IS NOT NULL :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM