gpt4 book ai didi

sql - 在 sysobjects/INFORMATION_SCHEMA 中查找 #temp 表

转载 作者:行者123 更新时间:2023-12-02 14:29:59 25 4
gpt4 key购买 nike

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

最佳答案

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

以下查询将显示,如果您有多个具有相同 #temp 表名称 (#preop) 的 session ,它们会以不同的名称显示在元数据中,并且名称不仅仅是 #preop。明确地说,这不是在 session 中查找此特定 #temp 表的 object_id 的方法,它还会返回其他表。再次强调,为了避免任何混淆,我从来没有想让任何人期望这是一个在 session 中查找名为 #preop 的 #temp 表的安全查询。它只是演示为什么 tempdb.sys.objects 中没有名为 #preop 的表:

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

如果您试图确定这样的对象是否存在于您的 session 中,以便您知道是否应该先删除它,您应该这样做:

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

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

DROP TABLE IF EXISTS #preop;

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

关于sql - 在 sysobjects/INFORMATION_SCHEMA 中查找 #temp 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21583268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com