首页 > 解决方案 > 'TRY - CATCH' 语句在存储过程中未按预期工作

问题描述

此代码工作正常,没有任何错误。但是我想查看 try-catch 语句的输出,并用 try-catch 语句包装了过程的主体,故意犯了一个错误。但是,该错误不会显示为网格结果集中的输出。尽管如此,它还是以默认方式出现。我需要知道我对这句话的使用是否正确。如果没有,有人可以向我解释一下 try-catch 语句的用法。

ALTER PROCEDURE UpdateStudent
    (@UpdateStudentDetails [UDTT_Stud] READONLY)
AS
BEGIN TRY
    BEGIN
        UPDATE dbo.StudentDetails        --Deleted 'A' of UPDATE to give an  error
        SET FirstName = upStud.FirstName,
            LastName = upStud.Lastname,
            HomeAddress = upStud.HomeAddress,
            EmailAddress = upStud.EmailAddress
        FROM
            StudentDetails stud
        INNER JOIN
            @UpdateStudentDetails upStud ON stud.IndexNumber = upStud.IndexNumber
    END
END TRY
BEGIN CATCH
    SELECT
        ERROR_MESSAGE() AS 'Error Message',
        ERROR_STATE() AS 'Error State',
        ERROR_SEVERITY() AS 'Error Severity'
END CATCH

这是我得到的输出

消息 102,级别 15,状态 1,过程 UpdateStudent,第 5 行 [BatchStart 第 0 行]
'UPDATE' 附近的语法不正确

标签: sql-serverstored-procedurestry-catch

解决方案


正如评论所说,你有一个语法错误,而不是一个运行时错误,可以被 try...catch 捕获。

您已经为 StudentDetails 表设置了一个别名,因此您应该使用它而不是 UPDATE StudentDetails。我还删除了 BEGIN TRY 块内不必要的 BEGIN END 块,并为整个存储过程添加了外部 BEGIN END。

ALTER PROCEDURE UpdateStudent
    (@UpdateStudentDetails [UDTT_Stud] READONLY)
AS 
BEGIN -- The entire stored procedure should be inside a BEGIN END block
   BEGIN TRY
       UPDATE stud -- We use the alias
       SET FirstName = upStud.FirstName,
           LastName = upStud.Lastname,
           HomeAddress = upStud.HomeAddress,
           EmailAddress = upStud.EmailAddress
       FROM
           StudentDetails stud
       INNER JOIN
           @UpdateStudentDetails upStud ON stud.IndexNumber = upStud.IndexNumber
   END TRY
   BEGIN CATCH
       SELECT
           ERROR_MESSAGE() AS 'Error Message',
           ERROR_STATE() AS 'Error State',
           ERROR_SEVERITY() AS 'Error Severity'
   END CATCH
END

推荐阅读