提问人:stonypaul 提问时间:2/6/2014 最后编辑:Aaron Bertrandstonypaul 更新时间:5/24/2023 访问量:30773
在 sysobjects/INFORMATION_SCHEMA 中查找 #temp 表
Finding #temp table in sysobjects / INFORMATION_SCHEMA
问:
我正在运行这样的语句,以便我可以在最终删除表之前操作数据。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'
答:
32赞
Aaron Bertrand
2/6/2014
#1
临时表不存储在本地数据库中,而是存储在 .此外,他们的名字不是你给他们起的名字;它有一个十六进制代码后缀和一堆下划线,用于消除会话之间的歧义。您应该使用 sys.objects 或 sys.tables
,而不是已弃用的 sysobjects
(注意顶部的大警告)或不完整和陈旧的 INFORMATION_SCHEMA
视图。tempdb
以下查询将显示,如果有多个会话具有相同的 #temp 表名称 (),则它们会以不同的名称显示在元数据中,并且名称不仅仅是 .需要明确的是,这不是如何在会话中找到此特定 #temp 表的方法,它还将返回其他表。同样,为了避免任何混淆,我从未打算让任何人期望这是一个安全的查询 #temp,用于在名为 .它只是在演示为什么没有以#preop
#preop
object_id
#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;
但是,如果此代码位于存储过程中,则实际上没有必要这样做...当存储过程超出范围时,应自动删除该表。
评论
0赞
stonypaul
2/6/2014
Aaron Bertrand - 谢谢 - 知道这很有用
0赞
stonypaul
2/6/2014
Aaron Bertrand - 所以这应该在存储过程的开头工作,但不是由于权限错误?IF EXISTS (SELECT name FROM tempdb.sys.objects WHERE name LIKE N'#preop[_]%') BEGIN DROP TABLE #preop END 错误是: 消息 3701,级别 11,状态 5,第 3 行 无法删除表“#preop”,因为它不存在或您没有权限。对不起,这看起来很垃圾,但是你如何编码评论?
0赞
Aaron Bertrand
2/6/2014
@Paul你不知道。更新问题以包含您尝试解决的所有问题。现在的问题是如何找到一个物体,而不是试图丢弃它。
0赞
Mathieu Guindon
2/24/2016
您可以在评论中使用@PaulStevens...但是,是的,不要。最好保留这些内容,以备不时之需,而不是保留整个片段。`backticks`
identifiers
1赞
Charlieface
5/24/2023
对我来说,使用似乎比使用相同的临时表名称对同时进行的会话进行排序更安全,不是吗?OBJECT_ID
LIKE
5赞
Raf
5/25/2016
#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
评论
0赞
gregsonian
1/31/2022
函数和友好名称的使用比使用谓词更具体。对我来说,缺少的部分是函数之前的数据库。OBJECT_ID
LIKE
[tempdb]
[dbo]
OBJECT_ID
0赞
Aaron Bertrand
5/24/2023
@gregsonian 我在回答中演示的谓词并不意味着如何找到 #temp 表的副本。它演示了为什么没有一个名为 .LIKE
tempdb.sys.objects
#preop
3赞
Lysoll
6/11/2019
#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%'
评论