临时表使用:存储过程嵌套时,均创建了相同名称的临时表.

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?的更多相关文章

  1. Spring 循环引用(一)一个循环依赖引发的 BUG

    Spring 循环引用(一)一个循环依赖引发的 BUG Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring 循环 ...

  2. MySQL 储存过程-原理、语法、函数详细说明

    Mysql储存过程是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之就是一组已经写好的命 ...

  3. 【转】oracle查询用户表,函数,储存过程,

    ◆Oracle查询用户表空间:select * from user_all_tables ◆Oracle查询所有函数和储存过程:select * from user_source ◆Oracle查询所 ...

  4. C#函数与SQL储存过程

    一点点小认识作为memo,求指正. C#的函数与SQL的储存过程有很多的相似性, 它们都是一段封闭的代码块,来提高代码的重用性,虽然现在复制粘贴很方便,但是我们在写多个函数的时候频繁的复制粘贴相同的内 ...

  5. SQL获取所有数据库名、表名、储存过程以及参数列表

    SQL获取所有数据库名.表名.储存过程以及参数列表 1.获取所有用户名:SELECT name FROM Sysusers where status='2' and islogin='1'islogi ...

  6. JDBC和JPA调用储存过程 接收存储过程有返回值

    ============jdbc==========================================--java代码:一个输出参数--String connURL = null;Con ...

  7. oracle储存过程,job,视图,触发器(记性不好,写个例子自己记)

    存储过程 create or replace procedure TestPro(Descerr out varchar2 ) is begin select * from test; excepti ...

  8. Mysql 储存过程以及 python callproc调用

    一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...

  9. SQL Server 储存过程的output 参数

    要做的参数的回传一方面要做到有储存过程的配合,再一方面也要有调用方法的配合,也就是说错误的调用方法是没有办法把值回传的. 下面是例子 --1.储存过程方面的配合 create procedure db ...

随机推荐

  1. GitHub 上下载代码运行报错 :'The sandbox is not sync with the Podfile.lock\'

    问题描述: github下载的Demo,很多时候使用到CocoaPods,有的时候因为依赖关系或者版本问题不能编译运行.出现例如The sandbox is not sync with the Pod ...

  2. Java语言基本语法(一)————关键字&标识符(Java语言标识符命名规范&Java语言的包名、类名、接口名、变量名、函数名、常量名命名规则 )

    一.关键字 关键字的定义和特点 定义:被Java语言赋予特殊含义,用做专门用途的字符串(单词). 特点:关键字中所有字母均为小写 下面列举一些常用的关键字. 用于定义数据类型的关键字:byte.sho ...

  3. HttpClient请求详解

    HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建 ...

  4. CentOS安装Git服务器

    1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum ...

  5. 在内存充足时malloc函数分配内存失败的原因及解决

    昨天在修改自己的代码的时候,碰到了malloc函数内存分配失败,上网翻了翻,一个很可能的原因是之前的代码出现了越界操作,导致malloc分配函数所涉及的一些信息被破坏.在这个思想的指导下,今天又是郁闷 ...

  6. DEV下拉框LookUpEdit使用技巧

    1,首先设置LookUpEdit要绑定的列,并配置隐藏列 2,设置下拉框是否显示表头,底部 3.设置下拉框宽度 4.设置显示的列与值列 5.设置初始值 6,绑定数据 7,取值  

  7. 如何在网上得到你想要的图片,如logo

    比如我们想得到网页:http://www.ahnu.edu.cn/里的安徽师范大学logo,可以这样做: 1.Ctrl+U,便进入了网页源代码页,也可以鼠标右键点"查看网页源代码" ...

  8. js:如何在循环异步请求的每次返回中添加想要的值

    先看一个场景 var arr = ["a","b","c"]; for (var i in arr) {         $.get(&qu ...

  9. Angular开发者指南(一)入门介绍

    什么是Angular AngularJS是动态Web应用程序的结构框架. 它允许您使用HTML作为模板语言,并允许您扩展HTML的语法以清晰,简洁地表达应用程序的组件.AngularJS的数据绑定和依 ...

  10. 2017-3-2 C# WindowsForm 中label标签居中显示

    有时候label标签要输出 label.text=""; 的语句,那么要把这个语句居中显示 1.要取消他的Autosize的值 2.拉大这个框,设置里面的文本的TextAlign ...