当前位置: 代码迷 >> Sql Server >> 局部临时表的范畴是多少?为什么内层存储的数据会插入到外层存储的同名表里面
  详细解决方案

局部临时表的范畴是多少?为什么内层存储的数据会插入到外层存储的同名表里面

热度:57   发布时间:2016-04-24 09:15:53.0
局部临时表的范围是多少?为什么内层存储的数据会插入到外层存储的同名表里面
有两个存储_sp1和_sp2
其中_sp1中没有定义临时表#tmp,但是有insert值;_sp2中定义了一个同名的#tmp表,并且调用_sp1,执行的结果是内层存储的数据插入到外层存储的同名的临时表了,而且不报错,为什么

create procedure _sp1
as
insert into #tmp values('2')


create procedure _sp2
as
create table #tmp(a varchar(10))
exec _sp1
select * from #tmp

------解决思路----------------------
因为你的两个过程,_sp2调用了_sp1,所以使用的是属于_sp2的临时表
------解决思路----------------------
存储过程有延迟名称解析功能,当你创建第一个存储过程_sp1,临时表即使不存在也不会报错的,但如果你单独调用该存储过程是会报错的,这时候是运行错误,因为临时表不存在。

但在你建立的第二个存储过程_sp2时刚好又建立了该临时表结构,再执行的第一个存储过程_sp1

当你调用_sp2时,实际是先创建了临时表,再调用的_sp1,这是后临时表的创建在执行_sp1之前,所以_sp1也不会报运行错,因为临时表确实创建了
------解决思路----------------------
引用:
Quote: 引用:


因为你的存储过程 在执行时,是在同一个会话中的,也就是说 类似于 变量的作用域一样。

sp2中的临时表 类似于全局变量,传入到 子程序sp1

谢谢,根据上面大概都知道了,有没有什么关于一个会话的定义或者什么的,感觉有点迷惑~~


我给你写了一个代码,你看看:




alter procedure _sp1
as
insert into #tmp values(@@spid)
go


alter procedure _sp2
as
create table #tmp(a varchar(10))
exec _sp1
select *,@@spid from #tmp
go


exec _sp2
/*
a (无列名)
493 493
*/


显然说明是在同一个会话中,会话id是 493
------解决思路----------------------
联机丛书的CREAT TABLE章节有这么一段解释:
Nested stored procedures can also create temporary tables with the same name as a temporary table that was created by the stored procedure that called it. However, for modifications to resolve to the table that was created in the nested procedure, the table must have the same structure, with the same column names, as the table created in the calling procedure.
嵌套的过程(指被调用的)可以创建与调用它的过程中已经创建的临时表同名的临时表,但是它们的结构、字段定义必须完全相同。
  相关解决方案