• 存储过程中的错误处理


    如果存储过程执行中遇到了错误(严重错误),就会终止sp的执行,但是如果想让sp跳过错误,继续执行后面的语句,怎么办?

    1,在sql server 2005中可以用try...catch解决。

    代码
    CREATE TABLE testTable
    (
        id 
    int IDENTITY(1,1),
        name 
    nvarchar(20NOT NULL,
        pass 
    nvarchar(20)
    )

    CREATE PROCEDURE testTableInsert

        
    @name nvarchar(20),
        
    @pass nvarchar(20)

    AS

        
    BEGIN TRY
            
    INSERT INTO testTable
            
    VALUES(@name,@pass)
        
    END TRY
        
    BEGIN CATCH
            
    PRINT @@error
            
    PRINT 'error'        
        
    END CATCH
        
        
    SELECT * FROM Test--(怎是存在的表)
        
        

    EXEC testTableInsert null,'test'

    2,sql server 2005之前,用sp嵌套的方法(来自zjcxc(邹建))

    代码
    --下面演示了SQL错误处理的脆弱性   
        
      
    --测试的存储过程1   
      create   proc   p1   
      
    as   
      
    print   12/0   
      
    if   @@error<>0   
      
    print   'error 1'   
        
      
    select   *   FROM SwcPage 
      
    if   @@error<>0   
      
    print   'error 2'   
      
    go   
        
      
    --调用   
      exec   p1   
      
    go   
        
      
    --删除测试   
      drop   proc   p1   
        
      
    /*--测试结果   
        
      服务器:   消息   8134,级别   16,状态   1,过程   p1,行   6   
      遇到被零除错误。   
      发生错误1   
      服务器:   消息   208,级别   16,状态   1,过程   p1,行   10   
      对象名   'newid'   无效。   
        
      --
    */   
    代码
    --下面演示了SQL错误处理的脆弱性   
        
      
    --演示2,存储过程嵌套调用中的错误   
        
      
    --测试的存储过程1   
      create   proc   p1   
      
    as   
      
    print   12/0   
      
    if   @@error<>0   
      
    print   'error 1'   
        
      
    select   *   from   newid()   
      
    if   @@error<>0   
      
    print   'error 2'   
      
    go   
        
      
    --测试的存储过程2   
      create   proc   p2   
      
    as   
      
    exec   p1   
        
      
    if   @@error<>0   
      
    print   'call sp1 error end'   
      
    else   
      
    print   'call sp1 normal end'   
      
    go   
        
      
    --调用   
      exec   p2   
      
    go   
        
      
    --删除测试   
      drop   proc   p1,p2   
        
      
    /*--测试结果   
        
      服务器:   消息   8134,级别   16,状态   1,过程   p1,行   8   
      遇到被零除错误。   
      发生错误1   
      服务器:   消息   208,级别   16,状态   1,过程   p1,行   12   
      对象名   'newid'   无效。   
      调用   存储过程1   异常结束   
      --
    */   

  • 相关阅读:
    Mysql源代码分析系列(2): 源代码结构转载
    Python 元组、列表、字典、文件
    Mysql源代码分析系列(1): 编译和调试转载
    ETL测试参考文档
    MySql select into与set的区别
    STL container
    mysqlclient5.0.2614 RPM for ppc
    linux多线程的总结(pthread用法)
    给线程变量pthread_t *thread动态分配空间
    当SQL数据库日志文件已满,或者日志很大,怎么办
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1653114.html
Copyright © 2020-2023  润新知