2011-03-07 65 views
1

在SQL Server中,名称类似于#temp的临时表具有本地作用域。如果在会话中创建它们,会话中的所有内容都可以看到它们,但不会在会话之外。如果您在存储过程中创建这样的表,那么作用域就是该过程的本地范围。所以当proc退出时,桌子就消失了。SQL Server中的会话全局临时表

我所知道的唯一的选择,就是用表与像##的临时名称。这些是暂时的,但在整个服务器范围内是可见的。所以如果我在会议中创建桌子,隔壁办公室的鲍勃也会看到他们。

我所寻找的是中间的某个位置,这样我就可以在存储过程中创建表,并有连存储的过程退出后,该表可用于我的会议。我能找到的最近的就是创建只有一个字段的表格,然后在存储的proc中对其进行修改。虽然这似乎有点混乱。

回答

1

当您启动会话你能不能创建表,然后执行存储过程,然后做你想要的存储过程执行后做表中任何其他?

+0

这就是我提到的kludge。我很可能需要这样做。 – 2011-03-07 10:36:26

0

我不认为这是一个开箱即用的SQL Server服务器解决方案。我认为唯一的办法是自己管理它。你可以用一些后缀创建一个普通表而不是使用blobal表(你可以通过它的全名来控制它)吗? 由于全局表转到tempdb,这也会帮助您将数据隔离到数据库中作为副作用。

2

你会缓存结果在您的客户端代码,如果并不意味着数据被持久化或共享。如果它意味着持久或共享,那么你会使用普通表。

换句话说,从一个结果,并调用透视存储过程调用应该是无状态的。如果数据对于会话是私有的,那么它应该在客户端中。这避免了使用服务器resourcey这就意味着你不需要保持连接呼叫

之间开这么说,你可以在连接只使用CONTEXT_INFO用于一个打开的连接上保持数据的少量(128个字节)。

+0

我会分享的一种观点,但这不是新的代码。我试图让一个大规模的现有报告在更少的...呃...混乱的框架中工作。不幸的是,临时表必须现在存在,他们可以创建的地方是有限的。我可能需要使用我提到的kludge。 – 2011-03-07 10:37:50

+0

没什么不好,然后对不起...... – gbn 2011-03-07 12:16:34

4

另一个杂牌可能为你工作 - 这取决于许多临时表是如何这里涉及。

创建临时表,作为真实的表,一个名为SPID一个额外的列,默认为@@SPID

然后创建基于@@SPID值访问这些表的视图,但过滤器。所有通过这个视图进行的操作都应该看起来像是按照每个会话进行隔离的。例如:

create table temp_Boris (
    SPID int default @@SPID, 
    ColA int, 
    ColB varchar(10) 
) 
go 
create view vBoris 
as 
    select ColA,ColB from temp_Boris where SPID = @@SPID 
go 

然后,在一个连接,运行以下命令:

insert into vBoris(ColA,ColB) 
select 10,'abc' union all 
select 20,'def' 
go 
select * from vBoris 

,并在另一个连接,运行以下命令:

insert into vBoris(ColA,ColB) 
select 10,'abc' union all 
select 20,'def' 
go 
select * from vBoris 
select * from temp_Boris 
go 
delete from vBoris 
go 
select * from vBoris 
select * from temp_Boris 

,你会看到每个连接能够把“vBoris”有点像一个临时表 - 当然,你可能需要添加解决这个(可能更多列)的附加程序来清除旧/过时的结果表。

好吧,我承认,它也感觉很丑。

+0

我已经在其他情况下使用过,但我试图尽量减少所需的更改。所以为这个想法+1,但我要与内维尔K的答案。 – 2011-03-09 08:01:35