2012-06-25 104 views
0

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

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

就目前来看,这是不可能的,因为你的最终约束。您可以选择临时表,然后从临时表中进行选择。我们都会同意这一点,因为您可能刚刚选择了数据,这会非常愚蠢。因此,导致下一部分,*这显然不是整个图片*。如果你能提供更多的信息,那么帮助会更好。 – swasheck

+0

@ p.campbell他将如何查询存储过程之外的表变量? –

+0

增加了更多的上下文 – Jeff

回答

6

当存储过程超出范围时,#temp表将被删除(以及延迟删除)。所以它不在存储过程的范围之内。为了在过程完成后查看#temp的内容,您需要在执行存储过程之前创建它,并将其填充到内部或在存储过程中执行选择。

对于更新的需求,为什么不使用带有UserID上的键的永久表,并更新存储过程以将UserID作为参数?如果你已经有了一个用户表,那么你肯定可以将更新的会话信息存储在一列或两列。不需要CONTEXT_INFO或#temp表废话。

0

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

  1. 首先与主数据库连接字符串
  2. 二是你的正常应用程序的连接字符串中设置主数据库的上下文信息。