储存过程嵌套临时表同名引发的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 ...
随机推荐
- 学习Cocos2d的博客 --推荐
http://xiaominghimi.blog.51cto.com/2614927/d-6/p-1
- 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 ...
- Redis 学习数据类型
该文使用centos6.5 64位 redis-3.2.8 [root@localhost bin]# netstat -tunpl |grep 6379 查看redis 是否启动成功 一.Stri ...
- Angularjs学习笔记《一》
开始慢慢的学习新的框架,Angularjs,其中原理不知深浅,但有例子练习,慢慢熟知.看的英文文档一点点翻译学习. 第一个例子,写一个增加,选中,删除的例子, 首先要引进所用的框架源码,这样引进,下面 ...
- Debug和Release区别
VC下Debug和Release区别 最近写代码过程中,发现 Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步 ...
- Java回调机制解读
模块间调用 在一个应用系统中,无论使用何种语言开发,必然存在模块之间的调用,调用的方式分为几种: (1)同步调用 同步调用是最基本并且最简单的一种调用方式,类A的方法a()调用类B的方法b(),一直等 ...
- css伪元素用法大全
本文主要讲解css伪元素的用法,有需要的朋友可以阅读此文.本文讲解的伪元素有:before,after. 什么是伪元素(Pseudo element)? 伪元素不是真正的元素,不存在与文档之中,所以j ...
- java学习笔记——IO部分(遍历文件夹)
用File类写的一个简单的工具,遍历文件夹,获取该文件夹下的所以文件(含子目录下的文件)和文件大小: /** * 列出指定目录下(包含其子目录)的所有文件 * @author syskey * */ ...
- Linux:- comm命令的妙用
参数://假设a集.b集.ab交集 # comm [options] textA textB options: 1.表示a集除去ab交集重叠那部分: 2.表示b集除去ab交集重叠那部分: 3.表示ab ...
- 淘宝API调用 申请 获取session key
在调用淘宝的API时,我们都会用到appkey,appsecret,appsession. 1.我们申请应用就会有appkey和appsecret了 2.正式环境下获取SessionKey 注意:we ...