临时表垃圾收集

时间:2012-06-25 21:23:14

标签: sql-server tsql 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

上面的代码产生错误

Msg 208, Level 16, State 0, Line 3
Invalid object name '#TestTempTable'.

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

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

更新: 我为什么这样做?

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

GetMySessionVariableName()

和程序

SetMySessionVariableName(值)

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

我找到了解决这个问题的解决方案,但我自己并不认为它是可靠的。 它是关于有两个不同的连接字符串:

  1. 首先使用主数据库连接字符串设置主数据库的上下文信息
  2. 其次是普通应用程序的连接字符串。