Sql server ';TRY-CATCH';语句在存储过程中未按预期工作

Sql server ';TRY-CATCH';语句在存储过程中未按预期工作,sql-server,stored-procedures,try-catch,Sql Server,Stored Procedures,Try Catch,这段代码工作正常,没有任何错误。但是我想看到try-catch语句的输出,并用try-catch语句包装了过程主体,故意犯了一个错误。但是,错误不会显示为网格结果集中的输出。尽管如此,它还是以默认方式出现。我需要知道我对这句话的使用是否正确。如果没有,请有人向我解释一下try-catch语句的用法 ALTER PROCEDURE UpdateStudent (@UpdateStudentDetails [UDTT_Stud] READONLY) AS BEGIN TRY BEGI

这段代码工作正常,没有任何错误。但是我想看到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
这是我得到的输出


Msg 102,级别15,状态1,过程更新学生,第5行[批处理起始行0]
“更新”附近的语法不正确


正如注释所说,您有一个语法错误,而不是try…catch可能捕捉到的运行时错误

您已经为StudentDetails表设置了别名,因此应该使用它,而不是更新StudentDetails。 我还删除了一个不必要的开始结束块内 BEGIN TRY块,并为整个存储过程添加了外部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

请阅读,try/catch不捕获语法错误,仅捕获运行时错误。请尝试一个简单的错误,例如
select convert(datetime,'12 juh 2019')
能否请您输入windows结果,您得到的结果是什么?try-catch语法正确,可能存在其他问题。try-catch捕获到运行时错误。Msg 102,级别15,状态1,过程UpdateStudent,第5行[批处理开始行0]靠近“UPATE”的语法不正确@MukeshArora这是我得到的输出这是一个语法错误,如果出现任何运行时错误,try-catch块将捕获该错误,try-catch块将不会捕获该错误。e、 g.在您的情况下,假设update语句由于引用完整性或更新将被try catch块捕获的not NULL列中的NULL值而失败。若要验证这一点,请对update语句进行注释,并将此select 1/0而不是update语句放入其中,然后运行您的过程,您将看到try catch块起作用