【问题标题】:How to drop a temporary table如何删除临时表
【发布时间】:2019-10-02 10:40:07
【问题描述】:

使用 SELECT .. INTO 语句创建临时表

SELECT *
    INTO #MyTempTable
FROM ...

在数据库、tempdb、临时表下,我看到了临时表 dbo.#MyTempTable____________________0000000016CA

现在我想放下桌子。我尝试了以下方法:

DROP TABLE IF EXISTS #MyTempTable

IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL 
BEGIN 
    DROP TABLE #MyTempTable 
END

两者都没有删除表

Select 返回 NULL:

SELECT OBJECT_ID('tempdb..#MyTempTable') 

【问题讨论】:

  • ##MyTempTable #MyTempTable.
  • DROP TABLE IF EXISTS #MyTempTable 也不起作用
  • @toms 你是否承诺?
  • 是的,我执行了,结果是“命令成功完成”。但是桌子还在

标签: sql-server sql-server-2016


【解决方案1】:

您可以使用 OBJECT_ID 的技巧。
但请确保检查其是否存在的表与您删除的表相同。

IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL 
BEGIN 
    DROP TABLE #MyTempTable;
END

或简化:

IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL 
    DROP TABLE #MyTempTable;

【讨论】:

  • @嗯,在编辑之前,另一个表被删除了。所以我认为可能是这样。但要知道#temporary 表只存在于会话中。例如,如果您在 SQL Server Management Studio 中打开一个窗口,则创建一个 #temp 表。然后,您只能在该查询窗口中从该表中进行选择,而不能在另一个查询窗口中进行选择(因为它是不同的会话)。当会话关闭时,它们会自动删除,例如当您关闭该查询窗口时。
  • 好吧,在同一个会话中,创建表后我运行 IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL BEGIN DROP TABLE #MyTempTable; END 但表没有被删除,并且 OBJECT_ID('tempdb..#MyTempTable', 'U') 返回 NULL 这意味着该表虽然存在却找不到
  • @toms 奇怪。该语法也按预期对我有用。即使有 BEGIN & END。示例 sn-p:IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL DROP TABLE #MyTempTable; create table #MyTempTable (col int); insert into #MyTempTable (col) values (1),(2),(3); select * from #MyTempTable; IF OBJECT_ID('tempdb..#MyTempTable', 'U') IS NOT NULL BEGIN DROP TABLE #MyTempTable; END select * from #MyTempTable;。你使用的是什么版本的 SQL Server(虽然怀疑是这样)
  • @toms 刚刚注意到一些事情。您在问题中提到dbo.#MyTempTable____________________0000000016CA 但这看起来像是 dbo 模式中普通表的命名?
【解决方案2】:

注意检查表和删除表的名称。#MyTempTable vs #lu_sensor_name_19

这对我有用:

IF OBJECT_ID('tempdb..#MyTempTable') IS NOT NULL DROP TABLE #MyTempTable;

如果这对您不起作用,我认为您的问题与临时表的范围和/或可见性有关。

临时表仅存在于创建它们的会话中, 我猜你正在删除一个不存在的临时表,或者另一个会话中的临时表。

首先,当您要删除表时,您必须检查创建 SELECT INTO 的会话是否仍然处于活动状态。

如果答案是肯定的,那么请检查您是从同一个会话中退出还是从另一个会话中退出。

在第二种情况下,您可以使用##MyTempTable 而不是#MyTempTable 来解决问题

否则意味着某物或其他人已经丢弃了它

【讨论】:

  • 我尝试使用#MyTempTable,只是忘记删除#lu_sensor_name_19
  • 然后解决你的问题,@toms。目前你说你不能删除表#MyTempTable,但是你在这两个语句中都没有try。一种是尝试删除对象##MyTempTable,另一种是#lu_sensor_name_19。当然,如果您没有编辑问题来修复它们,人们会认为这是印刷错误。
  • 表仍然存在,因为当我执行 SELECT * INTO #MyTempTable FROM ... 它说表已经存在
  • 也许你正试图从另一个会话中删除它,尝试在创建和删除它时使用##MyTempTable
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
  • 2011-11-07
  • 2011-12-17
相关资源
最近更新 更多