我似乎遇到了一个临时表垃圾收集的问题:
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,并且运行良好。现在,对于临时表,它不...我对替代方法的建议持开放态度。
发布于 2012-06-26 05:36:48
当存储过程超出作用域时,#temp表将被删除(好吧,延迟删除)。因此,它在存储过程的作用域之外是不可用的。为了在过程结束后查看#temp的内容,您需要在执行存储过程之前创建它,并将其填充到...或者在存储过程中执行select。
对于更新的需求,为什么不在UserID上使用一个带有键的永久表,并将存储过程更新为以UserID为参数呢?如果您已经有了一个Users表,那么您肯定可以在那里的一列或两列中存储更新的会话信息。不需要CONTEXT_INFO或#temp表的废话。
发布于 2012-07-30 21:52:26
我为这个问题找到了一个解决方案,但我自己并不认为它是可靠的。它是关于有两个不同的连接字符串:
https://stackoverflow.com/questions/11197561
复制相似问题