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

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. 使用node-inspector调试nodejs程序<nodejs>

    1.npm install -g node-inspector  // -g 导入安装路径到环境变量 一般是c盘下AppData目录下 2.node-inspector & //启动node- ...

  2. 通过 Chrome 在 Windows 中调试运行在 iphone-safari 上的 页面

    本文重点讨论如何在 Windows 系统中通过chrome 浏览器调试运行在 iPhone Safari 浏览器中的网页.如果你有一台 iMac/MacBook,可忽略该文档.iMac 环境下,直接通 ...

  3. static的加载先后顺序

    1.静态变量的声明和赋值是分开的,静态变量会先被声明,赋值操做被放在了静态代码块中. 2.静态变量的赋值和静态代码块的执行顺序和代码的先后书写顺序相关. 3.静态代码块优先执行,其次构造方法,最后普通 ...

  4. asyncio

    一.简介 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用, ...

  5. Cassandra issue - "The clustering keys ordering is wrong for @EmbeddedId"

    在Java连接Cassandra的情况下, 当使用组合主键时, 默认第一个是Partition Key, 后续的均为Clustering Key. 如果有多个Clustering Key, 在Java ...

  6. gridView 编辑单元格获取单元格焦点位置(位于单元格的焦点位置)

    1.主要代码: private void Form1_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Col ...

  7. tcp粘包和拆包的处理方案

    随着智能硬件越来越流行,很多后端开发人员都有可能接触到socket编程.而很多情况下,服务器与端上需要保证数据的有序,稳定到达,自然而然就会选择基于tcp/ip协议的socekt开发.开发过程中,经常 ...

  8. vuejs数据双向绑定原理(get & set)

    前端的数据双向绑定指的是view(视图)和model(数据)两者之间的关系:view层是页面上展示给用户看的信息,model层一般是指通过http请求从后台返回的数据.view到model的绑定都是通 ...

  9. 更改Debian Linux里面的EDT时区为CST时区

    Debian按默认安装,设置的是EDT时区.这样跟我们的系统就都对不上,因此得 改回CST. 只需要两步即可: 使用vi编辑/etc/timezone,把timezone文件的内容更改为:Asia/S ...

  10. Python 模块之 string.py

    用法 字符串常量: import string print(string.ascii_lowercase) print(string.ascii_uppercase) print(string.asc ...