代码之家  ›  专栏  ›  技术社区  ›  PowerUser

如何显示TEMP表的所有列名[重复]

  •  1
  • PowerUser  · 技术社区  · 1 年前

    我正在跑步 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'
    
    0 回复  |  直到 11 年前
        1
  •  34
  •   Aaron Bertrand    1 年前

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

    以下查询将显示,如果您有多个会话具有相同的#temp表名( #preop ),它们以不同的名称出现在元数据中,并且名称不仅仅是 #preop .说清楚,这不是如何找到 object_id 对于会话中的这个特定#temp表,它也会返回其他值。同样,为了避免任何混淆,我从未想过任何人会期望这是一个安全的查询,用于在会话中查找名为的#temp表 #preop 。这只是说明为什么没有一个名为 #preop 在里面 tempdb.sys.objects :

    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
    

    在现代版本(SQL Server 2016+)中,这甚至更容易:

    DROP TABLE IF EXISTS #preop;
    

    然而,如果这段代码在存储过程中,那么真的没有必要这样做。。。当存储过程超出作用域时,应自动删除该表。

        2
  •  5
  •   Raf    8 年前

    我更倾向于查询 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
    
        3
  •  3
  •   Suraj Rao Aditya Agrawal    5 年前

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

    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%'