通常,在测试存储过程代码以进行改进或更改请求时,我发现自己将代码块直接复制并粘贴到Management Stuido中,调整变量并运行它们。
但是,很多时候代码依赖于在存储过程运行期间创建的临时表(而不是表变量)。在正常的操作过程中,这些表在sproc完成执行时被处理掉,但是当它们直接在管理工作室中运行时,它们显然会留在内存中。
这意味着我无法在每次调整时重新执行代码,因为它会尝试重新创建表并导致错误。
有时候调整代码以避免这种情况很容易,但是当有很多表格有点不切实际时。每次都会将代码复制并粘贴到新的查询窗口中,但这很快就会变得很烦人。
有没有办法简单地从当前会话的内存中清除临时表,这样你就可以在每次运行时重新开始?
答案 0 :(得分:2)
评论涵盖了最常用的方法,完整性为:
Connection > Change Connection
,导致会话刷新,从而删除临时表测试时,我经常在测试窗口的顶部有块注释的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