create procedure sp_1
as
declare @return as int
set @return=0
update t1 set ...
if @@error<>0
set @return=-1
return @return
但是在执行存储过程时出错,sqlserver就会自动终止存储过程的执行,这样返回值就不正确了,怎么解决呢
比如:在update表t1时,表t1设置了触发器,如果更新值有问题触发器会返回错误,这样sqlserver就会终止过程的执行

解决方案 »

  1.   

    在你的触发器和存储过程中用RAISERROR来报错啊RAISERROR('Err!', 1, 2)
      

  2.   

    create procedure sp_1
    as
    declare @return as int
    --set @return=0--这句多余
    SET XACT_ABORT ON--如果 Transact- SQL 语句产生了运行时错误,则回滚事务。
    BEGIN TRANSACTION
    update t1 set ...
    if @@error<>0
    IF @@ERROR <> 0 
       BEGIN
    ROLLBACK TRANSACTION
    RETURN(-1)
       ENDCOMMIT TRANSACTION
    SET XACT_ABORT OFF--这样存储过程遇到错误回滚所有更新,并且ADO会捕获错误而不会更新数据
      

  3.   

    多了句if @@error<>0
      

  4.   

    在你的触发器和存储过程中用RAISERROR来报错啊RAISERROR('Err!', 1, 2)
      

  5.   

    事务回滚
    ON ERROR GOTO ErrDEAL
    BEGIN TRANSACTION **********************
    **********************COMMIT TRANSACTIONErrDEAL:
    ROLLBACK TRANSACTION
      

  6.   

    你们的回答没有正确的,我是在触发器中用RAISERROR('Err!', 1, 2)来给个错误了,但是存储过程在SQL查询分析器中执行时会给出错误提示,但是ADO没有捕捉到错误。
    我分析了一下,sqlserver在执行时根本不执行if @@error<>0这句就已经结束了过程的执行
      

  7.   

    看下http://msdn2.microsoft.com/zh-cn/library/ms178592.aspx 這個對嚴重級別(Severity)的描述
    〉10的嚴重級別才會被程序識別,等待結果
      

  8.   

    /*Proc*/
    CREATE PROCEDURE procTry 
    AS
    Raiserror('Proc出錯',11,1)
    ReturnGO
    '程序
    On Error GoTo Err
    Dim Con As New ADODB.Connection
    Con.ConnectionString = Me.Adodc1.ConnectionString
    Con.Open
    Con.Execute ("procTry")
    Con.Close
    Set Con = Nothing
    Exit Sub
    Err:    MsgBox (Err.Description)測試了下 會彈出sp中的錯誤描述信息
      

  9.   

    pubs作的實驗
    /*TRIGGER */
    CREATE TRIGGER [aUpdate] ON [dbo].[authors] 
    FOR  UPDATE
    AS
    IF UPDATE(zip)
    Begin
    Raiserror('不能修改authors表中的zip紀錄',11,1)
    Return
    End/*Proc*/
    CREATE PROCEDURE procTry 
    AS--Raiserror('Proc出錯',11,1)
    --Return
    Update authors Set zip=94026 WHere au_id='172-32-1176'
    GO'程序
    和上面的一樣 彈出提示信息,不知道爲什麽你的沒有提示...
    難道是Rp問題
      

  10.   

    pubs作的實驗
    /*TRIGGER */
    CREATE TRIGGER [aUpdate] ON [dbo].[authors] 
    FOR  UPDATE
    AS
    IF UPDATE(zip)
    Begin
    Raiserror('不能修改authors表中的zip紀錄',11,1)
    Return
    End/*Proc*/
    CREATE PROCEDURE procTry 
    AS
    declare @return as intUpdate authors Set zip=94026 WHere au_id='172-32-1176'
    if @@error<>0
    begin
    set @return=-1
    return @return
    end 
    set @return=0
    return @return
    GO
    ----------
    Vb中的代码
        Dim m_cmm1 As New ADODB.Command
        On Error GoTo lerr
        With m_cmm1
            .ActiveConnection = cnnMain
            .CommandType = adCmdStoredProc
            .CommandText = "procTry "
            .Parameters.Append .CreateParameter("returnvalue", adInteger, adParamReturnValue, 0, 0)
            .Execute
            If .Parameters(0) < 0 Then Set m_cmm1 = Nothing: Exit Function
        End With
        On Error GoTo 0
        EnsureStBill = True
        Exit Function
    lerr:
        ....
    -----
    我是在调用存储过程的返回值来判断是否执行成功的,但是触发器给出的错误时sqlserver终止了过程的执行返回值就不正确了
      

  11.   

    你是说在SQL的PROC中忽略触发器的作用是吗?
    这个不会...
      

  12.   

    //我是在触发器中用RAISERROR('Err!', 1, 2)来给个错误了,但是存储过程在SQL查询分析器中执行时会给出错误提示,但是ADO没有捕捉到错误。不可能,raiserror就是返回错误提示给应用程序的
      

  13.   

    RAISERROR('Err!', 1, 2)
    1的错误程度不足  被系统吃了
      

  14.   

    我开始用的是RAISERROR('Err!', 16, 1),后来改成RAISERROR('Err!', 10, 1)都不行
      

  15.   

    在SQL server查询分析器中调试储存过程,发现在触发器给出错误并rollback tran后并没有返回存储过程而是直接退出了,给出的是returnvalue=N/A。我在网上查了一下,说是sqlserver的bug不是道是否如此
      

  16.   

    你们好!“电厂生产管理系统”本人刚刚完成,需要的朋友可以与我联系,我用QQ直接发给你,打包后有30M,源码只有2.5M,呵。。我的QQ:450939943