储存过程嵌套临时表同名引发的BUG?
临时表使用:存储过程嵌套时,均创建了相同名称的临时表.
create procedure SP_A ( @i int output )
as
begin
create table #t ( ta int );
insert into #t
( ta )
values ( convert(int, getdate()) );
select @i=count(0)
from #t;
print @i;
end;
go
create procedure SP_B
as
begin
create table #t ( tb int );
insert into #t
( tb )
values ( 1 ),
( 2 ),
( 3 );
declare @f int;
exec dbo.SP_A @f output;
select @f;
end;
go
declare @a int;
exec SP_A @a output;
select @a;
go
exec SP_B;

/*------------------------
exec SP_B;
------------------------*/
(3 行受影响)
消息 207,级别 16,状态 1,过程 SP_A,行 6 [批起始行 33]
列名 'ta' 无效。
(1 行受影响)
---------------------------------------------------------------------------------------------------------------------
从以上信息,可以看到过程SP_A中insert into #t(ta)的时候报错,#t表中没有列名ta(此时#t应该是父过程中的#t(tb))
疑问:为什么不sp_a过程创建临时表#t的时候不报错?
于是修改过程sp_a
alter procedure SP_A ( @i int output )
as
begin
create table #t ( ta int );
select * from #t --增加此句,查询表结构返回.
insert into #t
( ta )
values ( convert(int, getdate()) );
select @i=count(0)
from #t;
print @i;
end;
再运行测试 :


可以看到此时sp_a select * from #t返回是没数据,但列名是(无列名)
这个就太奇怪了.为什么这个临时表#t没有列名呢?
尝试:sp_a过程#t再增加一个字段列试试下?
alter procedure SP_A ( @i int output )
as
begin
create table #t ( ta int ,taa int);
select * from #t
insert into #t
( ta )
values ( convert(int, getdate()) );
select @i=count(0)
from #t;
print @i;
end;
go


运行结果和上面一样,#t还是无列名,且只有返回一列.
于是对sp_b过程#t增加两列试下?
alter procedure SP_B
as
begin
create table #t ( tb int,tc int,td int );
insert into #t
( tb )
values ( 1 ),
( 2 ),
( 3 );
declare @f int;
exec dbo.SP_A @f output;
select @f;
end;
go


奇怪的事情,此时sp_a中返回的结果还是只有一列(无列名)
疑问:此时sp_a中返回的结果集的#t表到底是来自哪里呢?
看来以后存储过程如果嵌套调用,需要注意临时表的命名不能重名.
之于原因,暂时末找到,也不知道是不是bug,望各位不吝赐教,谢谢~
储存过程嵌套临时表同名引发的BUG?的更多相关文章
- Spring 循环引用(一)一个循环依赖引发的 BUG
Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...
- MySQL 储存过程-原理、语法、函数详细说明
Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...
- 【转】oracle查询用户表,函数,储存过程,
◆Oracle查询用户表空间:select * from user_all_tables ◆Oracle查询所有函数和储存过程:select * from user_source ◆Oracle查询所 ...
- C#函数与SQL储存过程
一点点小认识作为memo,求指正. C#的函数与SQL的储存过程有很多的相似性, 它们都是一段封闭的代码块,来提高代码的重用性,虽然现在复制粘贴很方便,但是我们在写多个函数的时候频繁的复制粘贴相同的内 ...
- SQL获取所有数据库名、表名、储存过程以及参数列表
SQL获取所有数据库名.表名.储存过程以及参数列表 1.获取所有用户名:SELECT name FROM Sysusers where status='2' and islogin='1'islogi ...
- JDBC和JPA调用储存过程 接收存储过程有返回值
============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...
- oracle储存过程,job,视图,触发器(记性不好,写个例子自己记)
存储过程 create or replace procedure TestPro(Descerr out varchar2 ) is begin select * from test; excepti ...
- Mysql 储存过程以及 python callproc调用
一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...
- SQL Server 储存过程的output 参数
要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure db ...
随机推荐
- HDU 3785 寻找大富翁
寻找大富翁 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- Python package install血泪史
[前言][絮絮叨叨篇]:说实话,不是第一次安装Python库了,但是貌似没有特别顺利的时候,可能还是遇到的困难不够多咯.配置环境真是个糟心的事儿,不过作为菜鸟,还是得磨练磨练,毕竟某人云:" ...
- [原创.数据可视化系列之十三]idw反距离权重插值算法的javascript代码实现
图形渲染中,idw反距离权重插值算法是一个应用非常广泛的方法,但是js实现的比较少,目前实现一个: //idw算法 //输入[[x:0,y:0,v:0],[x:0,y:0,v:0],[x:0,y:0, ...
- 查看hive中某个表中的数据、表结构及所在路径
查看hive中action_data_myisam表中的数据.表结构及所在路径 1.客户端进入hive环境:hive 2.查看表数据,鉴于数据量大,这里只显示前五条:select * from act ...
- JavaScript 毒瘤和糟粕(需要注意的地方)
简介 我想这是在我总结JavaScript系列中最为需要注意的,最为重要的内容.你必须要去了解这些问题特性,才能准备好应对措施,这真的很重要. 毒瘤 全局变量 全局变量的存在的确是带来了方便,但是我觉 ...
- Hibernate一对一外键映射
Hibernate 一对一外键映射 ------------------------------ ----- ...
- C# .NET更智能的数据库操作封装项目
前面两篇文章介绍了框架的思路及里面大概的实现过程,那时候忘记上传项目,就补发一下.顺便介绍下框架使用方式,并分析下框架使用的优缺点. 先发一下前两章的链接 篇一:http://www.cnblogs. ...
- java实现多叉树查找
package tree; import java.util.List; import java.util.ArrayList; import java.io.Serializable; public ...
- Hibernate学习笔记①
---恢复内容开始--- 1.JavaEE的三层结构 WEB层--Service层--DAO层 2.Hibernate版本 Hibernate3.x 4.x 5.x 4版本是过渡版本 不使用 5 ...
- Struts2学习笔记⑥
在微信读书上在看一本李刚写的Struts 2.X权威指南 (好像叫这个)的书,可以看得出来作者的开发经验还是很充足的,但是觉得他的尺度和顺序没有把握好,他自己说拦截器是数据校验.国际化的基础-完了还把 ...