为什么存储过程中的TRY-CATCH语句不起作用?

时间:2019-12-10 10:36:36

标签: sql-server stored-procedures try-catch

我创建了一个存储过程,该过程用于更新表中的值并将记录输入到另一个表中。应该按照以下步骤进行。

更新 Marks 表中是否选中了商标后,应在表 UpdatedMarkDetails 中输入一条记录,其中记录的 MarkCode 和值(以前的值)
另外,我想知道何时输入不存在的 MarkCode 。所以我放了一条TRY-CATCH语句,但是它也不起作用。查询编辑器中也出现“无法绑定”错误。
代码如下

ALTER PROCEDURE ChangeStatusOfMarks(@GivenMarkCode AS INT, @Value AS NVARCHAR(3))
AS
BEGIN TRY
    BEGIN
        UPDATE dbo.Marks
            SET dbo.Marks.IsChecked = @Value
            WHERE dbo.Marks.MarkCode = @GivenMarkCode
    END
    BEGIN
        INSERT INTO [dbo].[UpdatedMarkDetails]
            ([UpdatedMarkCode],[MarkCode],[ExistedStatus])
            VALUES
            (NEWID(),
            SELECT Marks.MarkCode FROM dbo.Marks,
            SELECT Marks.IsChecked FROM dbo.Marks
            )
    END
END TRY
BEGIN CATCH
    SELECT
        ERROR_LINE() AS 'ERROR LINE',
        ERROR_MESSAGE() AS 'ERROR MESSAGE',
        ERROR_SEVERITY() AS 'ERROR SEVERITY'
END CATCH

我得到如下错误

  

消息156,级别15,状态1,过程ChangeStatusOfMarks,行14 [批处理开始行0]   关键字“ SELECT”附近的语法不正确。
  消息156,级别15,状态1,过程ChangeStatusOfMarks,第15行[批处理开始第0行]   关键字“ SELECT”附近的语法不正确。
  消息102,级别15,状态1,过程ChangeStatusOfMarks,行16 [批处理开始行0]   ')'附近的语法不正确。

1 个答案:

答案 0 :(得分:3)

因为有语法错误,这意味着ALTER SP的SQL失败。与TRY...CATCH无关。修正语法错误:

ALTER PROCEDURE ChangeStatusOfMarks (@GivenMarkCode AS int,
                                     @Value AS nvarchar(3))
AS
BEGIN TRY
    BEGIN
        UPDATE dbo.Marks
        SET dbo.Marks.IsChecked = @Value
        WHERE dbo.Marks.MarkCode = @GivenMarkCode;
    END;
    BEGIN
        INSERT INTO [dbo].[UpdatedMarkDetails] ([UpdatedMarkCode],
                                                [MarkCode],
                                                [ExistedStatus])
        VALUES (NEWID(), (SELECT Marks.MarkCode FROM dbo.Marks), (SELECT Marks.IsChecked FROM dbo.Marks));
    END;
END TRY
BEGIN CATCH
    SELECT ERROR_LINE() AS [ERROR LINE],
           ERROR_MESSAGE() AS [ERROR MESSAGE],
           ERROR_SEVERITY() AS [ERROR SEVERITY];
END CATCH;

假设,表dbo.Marks只能永远包含1行。

不过,我个人将INSERT写为:

        INSERT INTO [dbo].[UpdatedMarkDetails] ([UpdatedMarkCode],
                                                [MarkCode],
                                                [ExistedStatus])
        SELECT NEWID(),
               MarkCode,
               IsChecked
        FROM dbo.Marks;

我也不确定为什么在这里有TRY...CATCH。您不会THROW错误,这意味着如果以上操作失败,错误将不会传播(除非您的目标是?)。也不会在失败时回滚事务(或启动事务)。但是,那是一个不同的问题/答案,只是提出了我要解决的问题的答案。