存储过程执行

-Tracy-McGrady- 2018-01-12 04:16:14

create proc p_总存储过程
as
begin
exec p_存储过程1
exec p_存储过程2
exec p_存储过程3
end

有没有什么办法,假如第一个存储过程执行失败(报错或者其他原因)的时候不影响存储过程2的执行?
...全文
579 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
日月路明 2018-01-12
  • 打赏
  • 举报
回复
我印象里本来就是楼主要求的执行方式
吉普赛的歌 2018-01-12
  • 打赏
  • 举报
回复
引用 8 楼 yangsh0722 的回复:
合并成一个,比如每30分钟执行一次的作业的存储过程。然后把需要30分钟执行一次的都放里面。假如后续又有新的需要30分钟执行的只用往这个存储过程里面加就可以了,之前建好的作业不用动。
那你按邹老师在 #4 的代码就可以了
-Tracy-McGrady- 2018-01-12
  • 打赏
  • 举报
回复
合并成一个,比如每30分钟执行一次的作业的存储过程。然后把需要30分钟执行一次的都放里面。假如后续又有新的需要30分钟执行的只用往这个存储过程里面加就可以了,之前建好的作业不用动。
-Tracy-McGrady- 2018-01-12
  • 打赏
  • 举报
回复
引用 6 楼 yenange 的回复:
[quote=引用 5 楼 yangsh0722 的回复:] [quote=引用 3 楼 zjcxc 的回复:] 执行输出: #p1 消息 8134,级别 16,状态 1,过程 #p1,行 1 [批起始行 12] Divide by zero error encountered. #p2 消息 50000,级别 16,状态 1,过程 #p2,行 1 [批起始行 12] error 16 #p3 (1 行受影响)
我之前有一些作业,运行时间不同,现在想把相同运行时间的作业放同一个作业里执行,这样迁移啊的时候就会方便许多。但是想假设其中的一个作业执行失败了,也就是存储过程执行失败了,不影响其他的执行。[/quote] 根本不需要那么麻烦, 你只需要设置三个步骤, 前面的步骤不管成功失败都转到下一步就可以了: [/quote] 我想把原来的三个存储过程合并成一个大的存储过程,只有一个步骤。
吉普赛的歌 2018-01-12
  • 打赏
  • 举报
回复
引用 5 楼 yangsh0722 的回复:
[quote=引用 3 楼 zjcxc 的回复:]
执行输出:
#p1
消息 8134,级别 16,状态 1,过程 #p1,行 1 [批起始行 12]
Divide by zero error encountered.
#p2
消息 50000,级别 16,状态 1,过程 #p2,行 1 [批起始行 12]
error 16
#p3

(1 行受影响)

我之前有一些作业,运行时间不同,现在想把相同运行时间的作业放同一个作业里执行,这样迁移啊的时候就会方便许多。但是想假设其中的一个作业执行失败了,也就是存储过程执行失败了,不影响其他的执行。[/quote]
根本不需要那么麻烦, 你只需要设置三个步骤, 前面的步骤不管成功失败都转到下一步就可以了:
-Tracy-McGrady- 2018-01-12
  • 打赏
  • 举报
回复
引用 3 楼 zjcxc 的回复:
执行输出: #p1 消息 8134,级别 16,状态 1,过程 #p1,行 1 [批起始行 12] Divide by zero error encountered. #p2 消息 50000,级别 16,状态 1,过程 #p2,行 1 [批起始行 12] error 16 #p3 (1 行受影响)
我之前有一些作业,运行时间不同,现在想把相同运行时间的作业放同一个作业里执行,这样迁移啊的时候就会方便许多。但是想假设其中的一个作业执行失败了,也就是存储过程执行失败了,不影响其他的执行。
zjcxc 元老 2018-01-12
  • 打赏
  • 举报
回复
如果不想抛出错误,或者把错误信息用普通方式输出,则考虑存储过程中 TRY CACH
create proc #p1 as raiserror('#p1', 10, 1) with nowait; select 1/0;
go
create proc #p2 as raiserror('#p2', 10, 1) with nowait; raiserror('error 16', 16, 1);
go
create proc #p3 as raiserror('#p3', 10, 1) with nowait; select 1;
go
create proc #pall
as
BEGIN TRY;
	exec #p1;
END TRY BEGIN CATCH;
	PRINT 'error1'
END CATCH;

BEGIN TRY;
	exec #p2;
END TRY BEGIN CATCH;
	PRINT 'error2'
END CATCH;

BEGIN TRY;
	exec #p3;
END TRY BEGIN CATCH;
	PRINT 'error3'
END CATCH;
go
exec #pall
go
drop proc #pall, #p1, #p2, #p3;

zjcxc 元老 2018-01-12
  • 打赏
  • 举报
回复
执行输出: #p1 消息 8134,级别 16,状态 1,过程 #p1,行 1 [批起始行 12] Divide by zero error encountered. #p2 消息 50000,级别 16,状态 1,过程 #p2,行 1 [批起始行 12] error 16 #p3 (1 行受影响)
zjcxc 元老 2018-01-12
  • 打赏
  • 举报
回复
一般的错误,SQL Server 自身是不会中断执行,但如果你的调用程序遇到错误就中止,那也就终止了 参考下面的测试,在 SSMS 中,3个 sp 都会执行的
create proc #p1 as raiserror('#p1', 10, 1) with nowait; select 1/0;
go
create proc #p2 as raiserror('#p2', 10, 1) with nowait; raiserror('error 16', 16, 1);
go
create proc #p3 as raiserror('#p3', 10, 1) with nowait; select 1;
go
create proc #pall
as
exec #p1;
exec #p2;
exec #p3;
go
exec #pall
go
drop proc #pall, #p1, #p2, #p3;

二月十六 版主 2018-01-12
  • 打赏
  • 举报
回复
try catch好像会有错误级别限制,别的不清楚。 ps:为什么要让它出现执行失败的情况呢。。

34,590

社区成员

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

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