首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >临时表垃圾回收

临时表垃圾回收
EN

Stack Overflow用户
提问于 2012-06-26 05:23:14
回答 2查看 1.5K关注 0票数 0

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

代码语言:javascript
复制
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

上面的代码产生了错误

代码语言:javascript
复制
Msg 208, Level 16, State 0, Line 3
Invalid object name '#TestTempTable'.

我认为这是因为#TestTempTable在proc退出时被垃圾回收。

有没有办法防止这种情况发生?我不想让每个调用者在调用过程之前都显式地创建临时表。

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

我需要存储一些上下文信息(基本上是一个会话变量)。我就是用CONTEXT_INFO做这个的。SQL Azure不支持CONTEXT_INFO,所以我进行了相应的重构。本质上,我有一个函数:

GetMySessionVariableName()

和一个过程

SetMySessionVariableName(值)

以前,此函数和过程在内部使用CONTEXT_INFO,并且运行良好。现在,对于临时表,它不...我对替代方法的建议持开放态度。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 05:36:48

当存储过程超出作用域时,#temp表将被删除(好吧,延迟删除)。因此,它在存储过程的作用域之外是不可用的。为了在过程结束后查看#temp的内容,您需要在执行存储过程之前创建它,并将其填充到...或者在存储过程中执行select。

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

票数 6
EN

Stack Overflow用户

发布于 2012-07-30 21:52:26

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

  1. 首先使用主数据库连接字符串设置主数据库的上下文信息
  2. 其次是普通应用程序的连接字符串。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11197561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档