Cob*_*ger 1 sql sql-server temp-tables
在 SQL Server 中,名称类似于 #temp 的临时表具有本地作用域。如果您在会话中创建它们,会话中的所有内容都可以看到它们,但不能在会话之外看到。如果在存储过程中创建这样的表,则作用域是该过程的本地范围。因此,当 proc 退出时,该表消失了。
我知道的唯一替代方法是使用名称类似于##temp 的表。这些是临时的,但在服务器范围内可见。因此,如果我在会话中创建表,隔壁办公室的 Bob 也会看到它们。
我正在寻找的是中间的某个地方,因此我可以在存储过程中创建表,并且即使在存储过程退出后,该表也可用于我的会话。我能找到的最近的方法是创建只有一个字段的表,然后在存储过程中更改它。不过,这似乎有点混乱。
另一个可能对您有用的杂物 - 这取决于这里涉及多少临时表。
将临时表创建为真实表,并带有一个名为 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
Run Code Online (Sandbox Code Playgroud)
然后,在一个连接上,运行以下命令:
insert into vBoris(ColA,ColB)
select 10,'abc' union all
select 20,'def'
go
select * from vBoris
Run Code Online (Sandbox Code Playgroud)
在另一个连接上,运行以下命令:
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
Run Code Online (Sandbox Code Playgroud)
并且您会看到每个连接都能够像处理临时表一样处理“vBoris”——当然,您可能需要为此添加额外的例程(可能还有更多列)以清除旧/陈旧结果表。
好吧,我承认,这感觉也很丑陋。