在SQL Server中,名为#temp的临时表具有本地范围。如果您在会话中创建它们,会话中的所有内容都可以看到它们,但不能在会话之外。如果在存储过程中创建此类表,则作用域是该过程的本地。所以当proc退出时,表就会消失。
我所知道的唯一选择是使用名称为## temp的表。这些是临时的,但在服务器范围内是可见的。因此,如果我在会话中创建表格,隔壁办公室的Bob也会看到它们。
我正在寻找的是中间的某个地方,所以我可以在存储过程中创建表,并且即使在存储过程退出之后,该表也可用于我的会话。我能找到的最近的是创建只有一个字段的表,然后在存储过程中更改它。不过,这似乎有点像kludge。
答案 0 :(得分:4)
可能适合您的另一个问题 - 这取决于此处涉及的临时表数量。
将临时表创建为真实表,并使用名为SPID的额外列,默认为@@SPID
。
然后创建一个访问这些表的视图,但基于@@SPID
值进行过滤。通过此视图进行的所有操作看起来都应该基于每个会话进行隔离。 E.g:
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”视为临时表 - 当然,您可能需要在此周围添加其他例程(可能还有更多列)来清除旧/陈旧表结果
好的,我承认,它也感觉很难看。
答案 1 :(得分:2)
如果数据不是要保留或共享,则会将结果缓存在客户端代码中。如果要保留或共享,那么您将使用普通表。
换句话说,从结果和调用的角度来看,存储过程调用应该是无状态的。如果数据对会话是私有的,那么它应该在客户端中。这样可以避免使用服务器资源,这意味着您无需在调用之间保持连接打开
说,您可以使用CONTEXT_INFO在该连接的开放连接上保留少量(128字节)数据。
答案 2 :(得分:1)
你是否可以在启动会话时创建表,然后执行存储过程,然后在执行存储过程执行后对表执行任何其他操作?
答案 3 :(得分:0)
我不认为SQL服务器中的开箱即用解决方案可满足您的需求。我认为唯一的办法就是自己管理它。是否可以创建一个带有一些后缀的普通表而不是使用全局表(你的全名是否有控件)? 由于全局表转到tempdb,这也可以帮助您将数据隔离到数据库中作为副作用。