pinkscut 发表于 2011-10-19 11:20

存储过程a调用存储过程b中的临时表#t

有一存储过程a中调用了存储过程b,b中使用了临时表#t,但#t在a中声明,请问我要如何执行b呢

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

Eisen 发表于 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

pinkscut 发表于 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

Eisen 发表于 2011-10-19 11:57

很明显p_b不能直接执行,必须通过p_a调用,我给你的例子是如何创建这样两个内含临时表的sp。
要执行的话,你得单独开一session,然后执行exec p_a就能看见结果。

pinkscut 发表于 2011-10-19 12:35

单独开一session?可以用isql连接服务器再执行吗?
那这样执行exec p_a怎么去找到p_b啊

呵呵,我是新手。

Eisen 发表于 2011-10-19 12:58

对,就是另外用isql, sql advantage,dbartisan, PB...连上去执行p_a
试一下就明白了

pinkscut 发表于 2011-10-19 15:00

呃,我在另外一个session执行了p_a,但是p_b还是没有创建成功啊。。。

Eisen 发表于 2011-10-19 15:49

严格照我在2楼的写法创建。

pinkscut 发表于 2011-10-19 16:08

多谢Eisen。
已经严格按照你的写法创建:)

andkylee 发表于 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.
页: [1] 2
查看完整版本: 存储过程a调用存储过程b中的临时表#t