临时表垃圾收集

Jef*_*eff 0 t-sql sql-server stored-procedures

我似乎遇到了临时表垃圾收集的问题:

CREATE PROCEDURE dbo.SetTestTempTable(@value bit)
AS
SET NOCOUNT ON
IF OBJECT_ID('tempdb..#TestTempTable') IS NOT NULL 
    DROP TABLE #TestTempTable
SELECT @value AS Value INTO #TestTempTable

GO

EXEC dbo.SetTestTempTable 1
SELECT * FROM #TestTempTable
Run Code Online (Sandbox Code Playgroud)

上面的代码产生错误

Msg 208, Level 16, State 0, Line 3
Invalid object name '#TestTempTable'.
Run Code Online (Sandbox Code Playgroud)

我认为因为#TestTempTable在proc退出时会收集垃圾.

有没有办法阻止这种情况?在调用过程之前,我不希望每个调用者都需要显式创建临时表.

更新:我为什么要这样做?

我需要存储一些上下文信息(基本上是一个会话变量).我正在使用CONTEXT_INFO.SQL Azure不支持CONTEXT_INFO,所以我会相应地重构.基本上,我有一个功能:

GetMySessionVariableName()

和一个程序

SetMySessionVariableName(值)

以前,这个函数和过程在内部使用了CONTEXT_INFO,并且工作正常.现在,对于临时表,它没有......我愿意接受关于替代方法的建议.

Aar*_*and 6

当存储过程超出范围时,#temp表将被删除(延迟删除).因此,除了存储过程的范围之外,您无法使用它.为了在过程完成后查看#temp的内容,您需要在执行存储过程之前创建它,并在其中填充...或在存储过程内执行select.

对于更新的要求,为什么不直接在UserID上使用带有键的永久表,并更新存储过程以将UserID作为参数?如果您已有Users表,则可以在一列或两列中存储更新的会话信息.不需要CONTEXT_INFO或#temp表废话.