zoukankan      html  css  js  c++  java
  • 在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 立即捕获错误代码。
  • 相关阅读:
    MVC3 的路由Test
    表连接
    Moq MVC 初窥门径(一)
    FATAL ERROR: JS Allocation failed process out of memory
    版本号的意义
    JavaScript 类型的隐式转换
    翻译foreach语句
    一次http请求的全过程(附mmap文件下载)
    AOP学习笔记
    Kindle3之中文乱码问题
  • 原文地址:https://www.cnblogs.com/lavenderzh/p/1364837.html
Copyright © 2011-2022 走看看