【问题标题】:Finding #temp table in sysobjects / INFORMATION_SCHEMA在 sysobjects / INFORMATION_SCHEMA 中查找 #temp 表
【发布时间】:2014-03-02 05:44:35
【问题描述】:

我正在运行这样的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'

【问题讨论】:

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


    【解决方案1】:

    临时表不存储在本地数据库中,它们存储在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
    

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

    DROP TABLE IF EXISTS #preop;
    

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

    【讨论】:

    • Aaron Bertrand - 谢谢 - 了解这些很有用
    • Aaron Bertrand - 所以这应该在存储过程开始时起作用,但不是因为权限错误? IF EXISTS (SELECT name FROM tempdb.sys.objects WHERE name LIKE N'#preop[_]%') BEGIN DROP TABLE #preop END 错误是:Msg 3701, Level 11, State 5, Line 3 不能删除表' #preop',因为它不存在或者您没有权限。抱歉,这看起来很垃圾,但是您如何编写 cmets 代码?
    • @Paul 你不知道。您更新问题以包含您尝试解决的所有问题。现在的问题是如何找到一个对象,而不是尝试丢弃它。
    • @PaulStevens 你可以在 cmets 中使用`backticks`...但是,不要。最好将它们保留在流浪 identifiers 或其他任何东西上 - 而不是整个 sn-ps。
    【解决方案2】:

    我更愿意以这种方式查询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】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-12
        • 2016-11-29
        • 1970-01-01
        • 2013-09-02
        • 2021-03-14
        • 2011-01-17
        • 1970-01-01
        • 2013-12-31
        相关资源
        最近更新 更多