【goto和return】接上一帖,想讨论下,麻烦大神们给点经验

geniuswjt 2011-11-10 05:54:56
新开个帖子讨论下:

刚才突然想到一点,是否用了@runflag这个做标识
排查问题的时候可以print @runflag看看是怎样跳出嵌套的?
而return不行?
不过好像有点牵强。。。
还希望有经验的人给点意见。。。什么情况用return会有影响?

goto对可读性造成很大的困扰,这个可以不讨论,主要想问下return的问题。

上帖链接:
http://topic.csdn.net/u/20111110/17/80e20697-80d9-45bf-b52a-d2c8b4b96e32.html?73122
...全文
247 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
q465897859 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 qianjin036a 的回复:]
引用 2 楼 geniuswjt 的回复:
还有个问题,在事务里(也比如触发器里,因为触发器本身就是个事务)用return,会怎样?
rollback是回滚,return应该只是它后面的语句不执行了,如果确认要停止的话,用return不会怎样吧。


恐怕 return 不是处处可以用的吧.
我好像只是在自定义函数里用到 return,还有在存储过程中返回执行是否正确的判断,其他地方貌……
[/Quote]+1
--小F-- 2011-11-10
  • 打赏
  • 举报
回复
GOTO用于跳转 一般情况下我们都不用

RETURN可以看成是返回程序尾的操作。
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
概念我都知道,只是想问下经验,一般用在什么地方,和什么情况下不用。[Quote=引用 17 楼 fredrickhu 的回复:]

GOTO语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。GOTO语句和标识符可以用在语句块、批处理和存储过程中,标识符可以为数字与字符的组合,但必须以“:”结尾。


RETURN语句用于无条件地终止一个查询、存储过程或者批处理,此时位于RETURN语句之后的程序将不会被执行。
[/Quote]
--小F-- 2011-11-10
  • 打赏
  • 举报
回复
GOTO语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。GOTO语句和标识符可以用在语句块、批处理和存储过程中,标识符可以为数字与字符的组合,但必须以“:”结尾。


RETURN语句用于无条件地终止一个查询、存储过程或者批处理,此时位于RETURN语句之后的程序将不会被执行。
--小F-- 2011-11-10
  • 打赏
  • 举报
回复
1.GOTO,主要用于跳转,但会打乱我们的程序逻辑,一般不使用,它可以实现RETURN,EXIT的功能

2.RETURN,返回程序末尾,结束程序

geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
谢谢,听NBDBA大哥一席经验总是受益匪浅[Quote=引用 14 楼 nbdba 的回复:]

为防止滥用,RETURN和GOTO都是应该规定哪些地方可用,一般

RETURN只用于:
1、参数有效性检查,无效的分支
2、出错处理分支
3、触发器特别是INSTEAD OF 触发器取消原语句运行的分支
4、某些函数可以马上返回的特定情况

GOTO只用于:
没有使用TRY...CATCH结构(经常不愿用这个结构)时,出错检测后转移到出错处理标记,仅此一项可用GOTO

……
[/Quote]
NBDBA 2011-11-10
  • 打赏
  • 举报
回复
为防止滥用,RETURN和GOTO都是应该规定哪些地方可用,一般

RETURN只用于:
1、参数有效性检查,无效的分支
2、出错处理分支
3、触发器特别是INSTEAD OF 触发器取消原语句运行的分支
4、某些函数可以马上返回的特定情况

GOTO只用于:
没有使用TRY...CATCH结构(经常不愿用这个结构)时,出错检测后转移到出错处理标记,仅此一项可用GOTO

geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
嗯,是的
不过比如有多个库,需要从A->B->C->D->A这样对一条传过来的数据进行处理
每个库有不同的分工,比如A是网关库,B、C、D分别是3个大类别的业务处理,数据处理完之后比如再返回网关
这样一个过程,从A进来的数据初始通过1个触发器来启动整个业务处理,或者可以通过存储过程开始第一步
之后的B、C、D中必须不同的过程或触发器来处理
sql中不用过程调用过程,那么只能触发器继续触发。。。还有什么好办法么?
[Quote=引用 11 楼 nbdba 的回复:]

RETURN主要用于可以结束的地方,比如出错,本分支处理到这里可以结束

关键是,T-SQL没有提供可以替代RETURN,GOTO等功能的可读性更好的方法。
存储过程调用存储过程影响效率,而对于数据库来说,性能是第一要务,所以不要试图把结构划分过程的思想搬到存储过程
[/Quote]
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
那比如说别的地方传过来一个值,而这个值不符合我们的规定
比如说传过来的只能是中文,他传了个数字过来,我想把它截断,不执行之后的处理
而不能用简单的if...else...
不用return的话。。。what can i do...[Quote=引用 9 楼 qianjin036a 的回复:]

引用 2 楼 geniuswjt 的回复:
还有个问题,在事务里(也比如触发器里,因为触发器本身就是个事务)用return,会怎样?
rollback是回滚,return应该只是它后面的语句不执行了,如果确认要停止的话,用return不会怎样吧。


恐怕 return 不是处处可以用的吧.
我好像只是在自定义函数里用到 return,还有在存储过程中返回执行是否正确的判断,其他地方……
[/Quote]
NBDBA 2011-11-10
  • 打赏
  • 举报
回复
RETURN主要用于可以结束的地方,比如出错,本分支处理到这里可以结束

关键是,T-SQL没有提供可以替代RETURN,GOTO等功能的可读性更好的方法。
存储过程调用存储过程影响效率,而对于数据库来说,性能是第一要务,所以不要试图把结构划分过程的思想搬到存储过程
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
你看下6楼的测试结果
触发器本身就是个事务,return了,照样是插入了,只不过后面代码不执行了,不过后面没代码
[Quote=引用 8 楼 timzhufaith 的回复:]

直接return的话 begin tran 和commit tran 能对应上嘛引用 2 楼 geniuswjt 的回复:
还有个问题,在事务里(也比如触发器里,因为触发器本身就是个事务)用return,会怎样?
rollback是回滚,return应该只是它后面的语句不执行了,如果确认要停止的话,用return不会怎样吧。
[/Quote]
-晴天 2011-11-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 geniuswjt 的回复:]
还有个问题,在事务里(也比如触发器里,因为触发器本身就是个事务)用return,会怎样?
rollback是回滚,return应该只是它后面的语句不执行了,如果确认要停止的话,用return不会怎样吧。
[/Quote]

恐怕 return 不是处处可以用的吧.
我好像只是在自定义函数里用到 return,还有在存储过程中返回执行是否正确的判断,其他地方貌似木有用过.
TimZhuFaith 2011-11-10
  • 打赏
  • 举报
回复
直接return的话 begin tran 和commit tran 能对应上嘛[Quote=引用 2 楼 geniuswjt 的回复:]
还有个问题,在事务里(也比如触发器里,因为触发器本身就是个事务)用return,会怎样?
rollback是回滚,return应该只是它后面的语句不执行了,如果确认要停止的话,用return不会怎样吧。
[/Quote]
NBDBA 2011-11-10
  • 打赏
  • 举报
回复
程序写法不应该考虑调试原因,你想的理由太牵强
快溜 2011-11-10
  • 打赏
  • 举报
回复
create table tb(id int)

create trigger tr_name on tb
for insert
as
if(select id from inserted)=1
return
else
insert into tb select 100

insert into tb select 0
select * from tb
/*id
-----------
0
100

(2 行受影响)*/

insert into tb select 1
select * from tb
/*
id
-----------
0
100
1

(3 行受影响)*/
快溜 2011-11-10
  • 打赏
  • 举报
回复
return在程序里是返回到开始部分,后面的不执行,在触发器中也是一样的调用方式
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复

大神们都没有这个困扰么,你们平常用怎样的方式呢
或者你们公司规定用怎样的方式。。。
就是问问大家的经验。
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
公司服务器用的05,我自己机器装的08,在05上我估计只能print来找错。。。[Quote=引用 1 楼 qianjin036a 的回复:]

goto 在大多数情况下是在抛出错误时设置的,既然SQL里保留,就有存在价值.
你这个@runflag是干什么用的呢?在 08 里就有调试功能了,你要调试可以直接看到你程序里的局部变量和监视,用不着去print的.
[/Quote]
geniuswjt 2011-11-10
  • 打赏
  • 举报
回复
还有个问题,在事务里(也比如触发器里,因为触发器本身就是个事务)用return,会怎样?
rollback是回滚,return应该只是它后面的语句不执行了,如果确认要停止的话,用return不会怎样吧。
-晴天 2011-11-10
  • 打赏
  • 举报
回复
goto 在大多数情况下是在抛出错误时设置的,既然SQL里保留,就有存在价值.
你这个@runflag是干什么用的呢?在 08 里就有调试功能了,你要调试可以直接看到你程序里的局部变量和监视,用不着去print的.

34,837

社区成员

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

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