Sybase存储过程调试疑问:Proc2的#Reserves能否传数据至Proc1的#Reserves?
临时表跨存储过程传递数据的问题解答
你遇到的这个情况其实是SQL Server本地临时表的作用域规则导致的,答案是Proc2的操作确实会把数据写入Proc1的#Reserves临时表中,下面结合你的代码和SQL Server的规则详细解释:
- 首先明确本地临时表的核心规则:以
#开头的本地临时表,作用域是当前会话,并且嵌套的存储过程可以访问外层存储过程创建的临时表。也就是说,当Proc1先创建了#Reserves,然后调用Proc2时,Proc2的执行上下文里是可以看到这个已经存在的临时表的。 - 看你提供的代码,Proc2里写了
Create Table #Reserves,按正常逻辑,这时候会抛出There is already an object named '#Reserves' in the database.的错误——但你说实际运行时数据被填充到了Proc1的表中,说明要么你的实际代码里Proc2的Create Table语句被条件判断跳过了,要么你使用了SQL Server 2016及以后支持的CREATE TABLE #Reserves ... IF NOT EXISTS语法。 - 如果Proc2里的
Create Table没有执行(或者因为IF NOT EXISTS跳过了创建),那么Proc2里的Insert into #reserves语句会直接操作Proc1已经创建好的#Reserves临时表,插入的数据自然会出现在Proc1后续的Select结果里。 - 反过来,如果Proc1没有提前创建
#Reserves,Proc2创建并填充自己的#Reserves,那么Proc2执行完毕后,这个临时表会被自动销毁,Proc1后续的Select会报错“对象名 '#Reserves' 无效”。
举个验证用的修改版Proc2代码,直接复用Proc1的临时表:
Create Proc Proc2 AS Begin -- 去掉Create Table,直接插入到Proc1已创建的临时表中 Insert into #reserves (id, value) Select 1 as id,2 as value End
或者用IF NOT EXISTS避免创建报错:
Create Proc Proc2 AS Begin If Not Exists(Select * from tempdb.sys.tables where name like '#Reserves%') Begin Create Table #Reserves ( id int not null, value int not null ) End Insert into #reserves (id, value) Select 1 as id,2 as value End
简单来说,只要外层存储过程提前创建了本地临时表,内层存储过程就可以直接访问并修改它,这就是你看到数据出现在Proc1的#Reserves里的原因。
内容的提问来源于stack exchange,提问作者asktonishant
相关产品推荐
相关产品推荐

