在SQL Server存储过程中使用事务及返回值

 1  Create   Procedure  testTran
 2 
 3  as
 4 
 5  declare   @UserID   int
 6 
 7  set  nocount  on
 8 
 9  begin   tran  AddUser
10 
11  insert   into  testTable(UserName,PassWord,Email)  values  ( ' milo ' , ' 831105 ' , ' milo42102126.com ' )
12 
13  if   @@Error   <>   0   or   @@rowcount   =   0   goto  ErrMsg
14 
15  set   @UserID   =   @@identity
16 
17  set  nocount  off
18 
19  commit   tran  AddUser
20 
21  return   1   -- 添加成功
22 
23 
24  ErrMsg:
25      set  nocount  off
26      rollback   tran  AddUser
27      return   - 1     -- 添加失败并回滚
28 
29 
30  GO
31 

SET NOCOUNT ON 优化存储过程

 

客户端的应用程序中是没有用的,这些信息是存储过程中的每个语句的DONE_IN_PROC 信息。

我们可以利用SET NOCOUNT 来控制这些信息,以达到提高程序性能的目的。

MSDN中帮助如下:
  
SET NOCOUNT
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。

语法
SET NOCOUNT { ON | OFF }

注释
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用   Microsoft SQL Server 提供的实用工具执行查询时,在 Transact-SQL 语句(如 select、_insert、 _update 和 _delete)结束时将不会在查询结果中显示"nn rows affected"。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

 

在查询分析器执行UPdate或Delete语句时,完成后会提示影响XX行记录,
当 SET NOCOUNT 为 ON 时执行完相关的操作不返回这个提示信息(根据实际情况有时候的确不需要此信息),通过该设置减少了网络流量而提高效率。
ON和OFF: 实际上就是一组开关,设置为on时,后面所有的相关sql都不再提示结果行数,设置为off时,就恢复原来状态了。 
 1 
 2  use  pubs   
 3  UPdate  dbo.titles  set  title_ID  =   ltrim (title_ID  
 4  -- 执行完上面的sql显示  (所影响的行数为 18 行)
 5  UPdate  dbo.titles  set  Title  =   ltrim (title)
 6  -- (所影响的行数为 18 行)
 7 
 8  SET  NOCOUNT  on
 9  UPdate  dbo.titles  set  title_ID  =   ltrim (title_ID)
10  -- 命令已成功完成。(没有行数提示了)
11  后面再执行什么sql都不会有行数提示了,除非  SET  NOCOUNT  off
12 


SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。(是指在编程阶段,没办法设置这个属性,必须用语句执行设置)

权限
SET NOCOUNT 权限默认授予所有用户。

结论:我们应该在存储过程的头部加上SET NOCOUNT ON 这样的话,在退出存储过程的时候加上 SET NOCOUNT OFF(没有必要写,只是写作习惯罢了,有些设置在存储过程中开启后需要是关闭,免的影响其他的语句)这样的话,以达到优化存储过程的目的。


多说两句:

1:在查看SqlServer的帮助的时候,要注意“权限”这一节,因为某些语句是需要一定的权限的,而我们往往忽略。

2:@@ROWCOUNT是返回受上一语句影响的行数,包括找到记录的数目、删除的行数、更新的记录数等,不要认为只是返回查找的记录数目,而且@@ROWCOUNT要紧跟需要判断语句,否则@@ROWCOUNT将返回0。

3:如果使用表变量,在条件表达式中要使用别名来替代表名,否则系统会报错。

4:在CUD类的操作中一定要有事务处理。

5:使用错误处理程序,用来检查 @@ERROR 系统函数的 T-SQL 语句 (IF) 实际上在进程中清除了 @@ERROR 值,无法再捕获除零之外的任何值,必须使用 SET 或 select 立即捕获错误代码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值