轻松命令从内存中清除临时表

时间:2014-05-14 12:33:59

标签: sql-server tsql temp-tables

通常,在测试存储过程代码以进行改进或更改请求时,我发现自己将代码块直接复制并粘贴到Management Stuido中,调整变量并运行它们。

但是,很多时候代码依赖于在存储过程运行期间创建的临时表(而不是表变量)。在正常的操作过程中,这些表在sproc完成执行时被处理掉,但是当它们直接在管理工作室中运行时,它们显然会留在内存中。

这意味着我无法在每次调整时重新执行代码,因为它会尝试重新创建表并导致错误。

有时候调整代码以避免这种情况很容易,但是当有很多表格有点不切实际时。每次都会将代码复制并粘贴到新的查询窗口中,但这很快就会变得很烦人。

有没有办法简单地从当前会话的内存中清除临时表,这样你就可以在每次运行时重新开始?

2 个答案:

答案 0 :(得分:2)

评论涵盖了最常用的方法,完整性为:

  1. 右键单击查询窗口并转到Connection > Change Connection,导致会话刷新,从而删除临时表
  2. 将SQL复制到新窗口执行相同的操作
  3. 测试时,我经常在测试窗口的顶部有块注释的drop命令,你可以选择并运行(命中F5),如下所示:

    /*    
    DROP TABLE #TEMP1
    DROP TABLE #TEMP2    
    */
    
    SELECT TOP 1 * 
    INTO #TEMP1
    FROM Users
    
    SELECT TOP 1 * 
    INTO #TEMP2
    FROM Users
    

    因此,您只需突出显示注释之间的行并运行所选语句。

    通常,如果我很高兴整个查询都会运行,那么我最后只会有DROP语句,所以我可以反复重复运行,除非你想要询问#TEMP表格。

答案 1 :(得分:1)

一个小的存储过程,可以放入您的项目中。

--
-- Drop all #temporary tables of active connexion.
--
CREATE PROCEDURE DropTempTables
AS
BEGIN
    SET NOCOUNT ON;

    declare @sql nvarchar(max)
    
    SELECT 
        @sql = concat(@sql, 'DROP TABLE ', SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1), '; ')
    FROM tempdb.sys.tables AS t
    WHERE t.name LIKE '#%[_][_][_]%'
    AND t.[object_id] = OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1))

    exec sp_executesql @sql
END
GO

然后您可以像这样使用它。

exec DropTempTables

SELECT * 
INTO #myTempTable
FROM table

SELECT * 
INTO #myTempTable
FROM table