免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6182 | 回复: 13
打印 上一主题 下一主题

存储过程a调用存储过程b中的临时表#t [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-19 11:20 |只看该作者 |倒序浏览
有一存储过程a中调用了存储过程b,b中使用了临时表#t,但#t在a中声明,请问我要如何执行b呢

ps:我执行了a,可以创建成功,但是报警b不存在;执行b,就报错找不到#t

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
2 [报告]
发表于 2011-10-19 11:30 |只看该作者
create table #t (id int)
go
create procedure p_b
as
begin
    select top 1 * from #t
end
go
drop table #t
go
create procedure p_a
as
begin
    create table #t(id int)
    insert #t select @@spid
    exec p_b
end
go

论坛徽章:
0
3 [报告]
发表于 2011-10-19 11:36 |只看该作者
谢谢Eisen的答复。
但是我现在执行过程是这样:
create procedure p_a
as
begin
    create table #t(id int)
    exec p_b
end
go

create procedure p_b
as
begin
    insert #t select @@spid
end
go

我现在在迁移数据库,从原数据库中extract出来的proc代码如上所示,在现数据库中执行上面两个proc

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
4 [报告]
发表于 2011-10-19 11:57 |只看该作者
很明显p_b不能直接执行,必须通过p_a调用,我给你的例子是如何创建这样两个内含临时表的sp。
要执行的话,你得单独开一session,然后执行exec p_a就能看见结果。

论坛徽章:
0
5 [报告]
发表于 2011-10-19 12:35 |只看该作者
单独开一session?可以用isql连接服务器再执行吗?
那这样执行exec p_a怎么去找到p_b啊

呵呵,我是新手。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
6 [报告]
发表于 2011-10-19 12:58 |只看该作者
对,就是另外用isql, sql advantage,dbartisan, PB...连上去执行p_a
试一下就明白了

论坛徽章:
0
7 [报告]
发表于 2011-10-19 15:00 |只看该作者
呃,我在另外一个session执行了p_a,但是p_b还是没有创建成功啊。。。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
8 [报告]
发表于 2011-10-19 15:49 |只看该作者
严格照我在2楼的写法创建。

论坛徽章:
0
9 [报告]
发表于 2011-10-19 16:08 |只看该作者
多谢Eisen。
已经严格按照你的写法创建

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
10 [报告]
发表于 2011-10-19 22:41 |只看该作者
创建存储过程的时候,新存储过程中可以调用不存在的存储过程。然而,存储过程中不能引用不存在的表!
所以,p_a是能够创建成功的。
对于存储过程p_b需要采用如Eisen所说的方法。
下面的创建顺序也是可以的。
create procedure p_a
as
begin
  create table #t(id int)
  exec p_b
end
go
create table #t(id int)
go
create procedure p_b
as
begin
  insert #t select @@spid
end
go
drop table #t
go


虽然创建p_a的时候有下面的提示信息:
Cannot add rows to sysdepends for the current stored procedure because it
depends on the missing object 'p_b'. The stored procedure will still be
created.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP