我似乎遇到了临时表垃圾收集的问题:
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,并且运行正常。现在,对于临时表,它没有......我愿意接受关于替代方法的建议。
答案 0 :(得分:6)
当存储过程超出范围时,#temp表被删除(好了,延迟删除)。因此,除了存储过程的范围之外,您无法使用它。为了在过程完成后查看#temp的内容,您需要在执行存储过程之前创建它,并在其中填充...或在存储过程内执行select。
对于更新的要求,为什么不直接在UserID上使用带有密钥的永久表,并更新存储过程以将UserID作为参数?如果您已有Users表,则可以将更新的会话信息存储在一列或两列中。无需CONTEXT_INFO或#temp表废话。
答案 1 :(得分:0)
我找到了解决这个问题的解决方案,但我自己并不认为它是可靠的。 它是关于有两个不同的连接字符串: