游标中调用存储过程,程序调用时未执行。查询分析器有执行

wzpwork 2010-03-12 10:31:01

我写了个存储过程A,存储过程A中有一个游标,在游标中调用B,C,D几个存储过程。

存储过程A的游标及调用代码是这样的:


DECLARE @iTHyid int
DECLARE @iTPid int
DECLARE @iTLevel int

DECLARE authors_cursor CURSOR FOR SELECT hyid,pid,L FROM #tmpUpUser

OPEN authors_cursor

FETCH NEXT FROM authors_cursor INTO @iTHyid , @iTPid , @iTLevel
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @iTHyid , @iTPid , @iTLevel

EXEC B @hyid, @iTHyid , @iTLevel
EXEC C @hyid , @iTHyid , @iTLevel
EXEC D @hyid , @iTHyid

FETCH NEXT FROM authors_cursor INTO @iTHyid , @iTPid , @iTLevel
END

在程序中调用时,游标循环到最后一或两条数据(前面的数据都执行了)时,执行正常,从结果来看没有调用存储过程B,C,D

我在查询分析器中手动执行存储过程A,执行正常,结果也正常
...全文
185 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzpwork 2010-03-13
  • 打赏
  • 举报
回复
程序逐个调用游标中的存储过程,全部成功。谢谢石头大哥。
bancxc 2010-03-13
  • 打赏
  • 举报
回复
帮顶 石头大哥厉害
wzpwork 2010-03-13
  • 打赏
  • 举报
回复
谢谢 无枪狙击手 ,我去查一下。

但我有一点疑问,为什么游标前面的记录执行了,最后两条会有问题呢?
并且游标记录下于9条时,没有这个问题
SQL77 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 happyflystone 的回复:]
引用 21 楼 wzpwork 的回复:
引用 20 楼 happyflystone 的回复:

请注意 你的BCD过程里是否有游标?
如果有WHILE @@FETCH_STATUS = 0这个判断就是不可靠的事情 ,


BCD中有游标



妥了,查吧
[/Quote]

原来呢,石头大哥厉害,其它游标下的状态不等于0了
-狙击手- 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wzpwork 的回复:]
引用 20 楼 happyflystone 的回复:

请注意 你的BCD过程里是否有游标?
如果有WHILE @@FETCH_STATUS = 0这个判断就是不可靠的事情 ,


BCD中有游标
[/Quote]


妥了,查吧
wzpwork 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 happyflystone 的回复:]

请注意 你的BCD过程里是否有游标?
如果有WHILE @@FETCH_STATUS = 0这个判断就是不可靠的事情 ,
[/Quote]

BCD中有游标
-狙击手- 2010-03-12
  • 打赏
  • 举报
回复
请注意 你的BCD过程里是否有游标?
如果有WHILE @@FETCH_STATUS = 0这个判断就是不可靠的事情 ,
sql_sf 2010-03-12
  • 打赏
  • 举报
回复
你想根据游标得到一组变量
然后单独执行三个存储过程看看
看看你得到变量在存储过程中是否是满足条件的
如果变量虽然有值,但是不符合条件,执行也没有结果啊
wzpwork 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 happyflystone 的回复:]

在程序中调用时,游标循环到最后一或两条数据(前面的数据都执行了)时,执行正常,从结果来看没有调用存储过程B,C,D

--

你的意思最后应有数据游标没循环? 你的游标执行完有正常关闭并删除引用吗
[/Quote]

就是这个意思。
我的数据游标有循环,执行完后正常闭闭并删除引用。
-狙击手- 2010-03-12
  • 打赏
  • 举报
回复
在程序中调用时,游标循环到最后一或两条数据(前面的数据都执行了)时,执行正常,从结果来看没有调用存储过程B,C,D

--

你的意思最后应有数据游标没循环? 你的游标执行完有正常关闭并删除引用吗
wzpwork 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 playwarcraft 的回复:]
是不是程序timeout了。。。
[/Quote]

在测试和实际应用过程中,这个存储过程非常快,不存在这个超时的问题。
Mr_Nice 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wzpwork 的回复:]
引用 8 楼 sql77 的回复:

引用 6 楼 ldslove 的回复:
引用 4 楼 orchidcat 的回复:
SQL code
SELECT @iTHyid , @iTPid , @iTLevel ---????

EXEC B @hyid, @iTHyid , @iTLevel


@hyid--??? @iTHyid --这个???



还是你的眼厉害……
[/Quote]

这个???信息不全,猜不出来了...
wzpwork 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 dawugui 的回复:]

游标中还有存储过程?太复杂了吧.
把存储过程中的代码直接转换到游标去,不要整那么复杂.
[/Quote]

这三个存储过程实现不同的业务逻辑,而且代码比较长。如果放在一起,代码的可读性和以后的维护性比较麻烦。所以封装成不同的存储过程。
wzpwork 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sql77 的回复:]

引用 6 楼 ldslove 的回复:
引用 4 楼 orchidcat 的回复:
SQL code
SELECT @iTHyid , @iTPid , @iTLevel ---????

EXEC B @hyid, @iTHyid , @iTLevel


@hyid--??? @iTHyid --这个???



还是你的眼厉害


晕,,,,前面这个变量都没有……
[/Quote]

变量是有声明的。我所贴的部分是出问题那部分的代码。
wzpwork 2010-03-12
  • 打赏
  • 举报
回复
SELECT @iTHyid , @iTPid , @iTLevel

这条是用于跟踪时用的,在实际使用中是把它注释掉的.

我这个游标是根据计算结果生成的临时表中进行读取,这个临时表很小,现有只有十多条记录,以后也不会超过100条记录。

所以这块性能上影响应该不大。

dawugui 2010-03-12
  • 打赏
  • 举报
回复
游标中还有存储过程?太复杂了吧.
把存储过程中的代码直接转换到游标去,不要整那么复杂.
chy710 2010-03-12
  • 打赏
  • 举报
回复

CREATE PROCEDURE sp_xxx()
BEGIN

DECLARE _done INT DEFAULT 0;
DECLARE _cur1 CURSOR FOR SELECT xx FROM table;
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET _done = 1;

OPEN _cur1;

REPEAT
FETCH _cur1 INTO _xx1,_xx2;
IF NOT _done THEN
--循环部分
--call sp();
END IF;
UNTIL _done END REPEAT;

CLOSE _cur1;
END;
playwarcraft 2010-03-12
  • 打赏
  • 举报
回复

是不是程序timeout了。。。
SQL77 2010-03-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ldslove 的回复:]
引用 4 楼 orchidcat 的回复:
SQL code
SELECT @iTHyid , @iTPid , @iTLevel ---????

EXEC B @hyid, @iTHyid , @iTLevel


@hyid--??? @iTHyid --这个???



还是你的眼厉害
[/Quote]

晕,,,,前面这个变量都没有?
EXEC B @hyid,
SQL77 2010-03-12
  • 打赏
  • 举报
回复
没看出来哪有问题
加载更多回复(6)

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧