在sysobjects / INFORMATION_SCHEMA中查找#temp表

时间:2014-02-05 16:45:54

标签: sql sql-server sql-server-2005

我正在运行这样的SELECT INTO语句,所以我可以在最终删除表之前操作数据。

SELECT colA, colB, colC INTO #preop FROM tblRANDOM

然而,当我运行语句然后,在不删除新创建的表的情况下,然后我运行以下任一语句,找不到表?即使通过对象浏览器扫描我也看不到它。我应该在哪里看?

SELECT [name] FROM sysobjects WHERE [name] = N'#preop'
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '#preop'

3 个答案:

答案 0 :(得分:17)

临时表未存储在本地数据库中,它们存储在tempdb中。他们的名字也不是你的名字;它有一个十六进制代码后缀和一堆下划线来消除会话之间的歧义。您应该使用sys.objectssys.tables,而不是deprecated sysobjects (note the big warning at the top)the incomplete and stale INFORMATION_SCHEMA views

SELECT name FROM tempdb.sys.objects WHERE name LIKE N'#preop[_]%';

如果您正在尝试确定会话中是否存在这样的对象,那么您应该知道是否应该首先删除它,您应该这样做:

IF OBJECT_ID('tempdb.dbo.#preop') IS NOT NULL
BEGIN
  DROP TABLE #preop;
END

但是,如果此代码在存储过程中,那么实际上没有必要这样做......当存储过程超出范围时,应该自动删除该表。

答案 1 :(得分:0)

我更愿意以这种方式查询tempdb

IF  EXISTS (SELECT * FROM tempdb.sys.objects 
             WHERE object_id = OBJECT_ID(N'tempdb.[dbo].[#MyProcedure]')
             AND type in (N'P', N'PC'))
BEGIN 
    print 'dropping [dbo].[#MyProcedure]'
    DROP PROCEDURE [dbo].[#MyProcedure]
END
GO

答案 2 :(得分:0)

下面是我如何获取临时表的列:

CREATE TABLE #T (PK INT IDENTITY(1,1), APP_KEY INT PRIMARY KEY)

SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS c WHERE c.TABLE_NAME LIKE '#T%'