我接受采访时,面试官问我一个问题,你怎么能在另一个存储过程中创建的存储过程中访问临时表,并且该过程不会删除临时表?
我回答他你可以在同一个会话中访问临时表。他说但是你什么时候会这样做:
Select * from #table
它会产生错误,因为#table不是在当前SP中创建的。我说你可以在同一个会话中访问临时表,如果两个SP在同一个会话中,那么你可以访问该临时表。我没有尝试这个,但会有一些方法来访问它。他说是的,你可以访问它但是怎么样?在家尝试。
我知道用#table创建的表是临时表。它只能在同一个会话中访问。我试图在同一个会话中访问由其他sp创建的临时表,但我无法访问它。有没有办法做到这一点?
答案 0 :(得分:5)
以达米恩的评论为基础......
该表可以由创建表
的存储过程执行的任何嵌套存储过程引用
create proc usp_innertest1
as
begin
select n as innertest1 from #test
end
create proc usp_innertest2
as
begin
select n as innertest2 from #test
end
create proc dbo.test
as
begin
select top 1* into #test from numbers
exec usp_innertest1
exec usp_innertest2
end
现在执行测试给出了
innertest1
1
innertest2
1
调用创建表
的存储过程的进程无法引用该表
这很明显,如果usp_innertest1创建临时表,则无法通过test(主调用进程)访问它
还有全局临时表,直到所有引用关闭
---connection1
select top 1 * into ##test from numbers
--now open new connection(connection 2) and do below
begin tran
update ##test
set id=1
--now close connection1
-- now go to connection 2
select * from ##test
you can access this table until you committed it
commit
答案 1 :(得分:1)
你必须从创建这个临时表的那个中调用你想要使用这个临时表的存储过程。
答案 2 :(得分:0)
如果要将全局临时表用于...
select *from ##testTempTable
即使在视图或存储过程中,也可以用于选择其他范围,例如。
>>> d = {0:[[1,2],[3,4]]}
>>> d[1] = [[0]*2]*2
>>> d
{0: [[1, 2], [3, 4]], 1: [[0, 0], [0, 0]]}
>>> d[1][0][0] = 5
>>> d
{0: [[1, 2], [3, 4]], 1: [[5, 0], [5, 0]]}
答案 3 :(得分:0)
select distinct object_name(id)
from syscomments
where text like '%#tmp_table_name%'
order by object_name(id)
这将返回使用临时表中特定文本的所有存储过程的列表