zoukankan      html  css  js  c++  java
  • 存储过程中的错误处理

    如果存储过程执行中遇到了错误(严重错误),就会终止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   异常结束   
      --
    */   

  • 相关阅读:
    docker: 定时检查docker container的运行状态并发邮件报警
    docker: 解决centos7下cgroup.procs: no such device的错误
    Redis: 改变HomeBrew安装的数据库文件目录
    MySQL: 改变Homebrew安装MySQL/MariaDB的数据库文件目录
    Node: 在Mac中离线安装Sqlite3
    通过DaoCloud发布Ghost
    Node: Updating npm's bundled node gyp
    Android Broadcast管理
    Android PackageManager packages.xml文件格式
    Android PackageManager概览
  • 原文地址:https://www.cnblogs.com/icebutterfly/p/1653114.html
Copyright © 2011-2022 走看看