嵌套 Try Catch 如何到达外部 catch 块?

Blo*_*cks 1 t-sql

如何到达“外部捕获块,删除此处插入的任何记录?” 当我在两个内部 Try Catch 块中创建错误时,它仍然不会转到外部 catch 块。我每分钟发布一批大约 1000 条记录,每条记录插入大约 20 个表。所以我需要尝试所有插入查询而不是在第一个错误处停止,这样我就可以获得详细的日志并快速响应所有数据错误。

CREATE TABLE [dbo].[StudentDetails](
    [Roll] [int] NULL,
    [Name] [varchar](50) NULL,
    [Address] [varchar](50) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Library](
    [Roll] [int] NULL,
    [Name] [varchar](50) NULL,
    [Address] [varchar](50) NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

--1 错误

BEGIN TRY
  print 'At Outer Try Block'
   BEGIN TRY
      print 'At Inner Try Block 1'
      INSERT INTO StudentDetails(Roll, [Name])
        VALUES('a', 'Abhijit')  -- Throwing Exception
   END TRY
   BEGIN CATCH
      print 'At Inner catch Block 1, Log Errors'
   END CATCH
   BEGIN TRY
      print 'At Inner Try Block 2'
      INSERT INTO StudentDetails(Roll, [Name])
        VALUES('1', 'Abhijit')  -- Throwing Exception
   END TRY
   BEGIN CATCH
      print 'At Inner catch Block 2, Log Errors'
   END CATCH
      --... to 20 inserts
END TRY
BEGIN CATCH
   print 'At Outer catch block, if an error delete any inserted records'
END CATCH

Query result
At Outer Try Block
At Inner Try Block 1
At Inner catch Block 1, Log Errors
At Inner Try Block 2
Run Code Online (Sandbox Code Playgroud)

--2 错误

BEGIN TRY
  print 'At Outer Try Block'
   BEGIN TRY
      print 'At Inner Try Block 1'
      INSERT INTO StudentDetails(Roll, [Name])
        VALUES('a', 'Abhijit')  -- Throwing Exception
   END TRY
   BEGIN CATCH
      print 'At Inner catch Block 1, Log Errors'
   END CATCH
   BEGIN TRY
      print 'At Inner Try Block 2'
      INSERT INTO StudentDetails(Roll, [Name])
        VALUES('a', 'Abhijit')  -- Throwing Exception
   END TRY
   BEGIN CATCH
      print 'At Inner catch Block 2, Log Errors'
   END CATCH
      --... to 20 inserts
END TRY
BEGIN CATCH
   print 'At Outer catch block, if an error delete any inserted records'
END CATCH

Query result
At Outer Try Block
At Inner Try Block 1
At Inner catch Block 1, Log Errors
At Inner Try Block 2
At Inner catch Block 2, Log Errors
Run Code Online (Sandbox Code Playgroud)

Han*_*onn 5

我同意@Alex 的观点,即您应该在遇到失败的情况下回滚事务。

这是嵌套TRY - CATCH块的示例:

-- Throw from inner catch to outer catch block
BEGIN TRY
    PRINT 'Outer Try';
    --Throw 50000, 'Outer Error', 1; -- Uncomment this to skip the inner try.

    BEGIN TRY
        PRINT 'Inner Try';
        Throw 50000, 'Inner Error', 1;
    END TRY
    BEGIN CATCH
        PRINT 'Inner Catch';
        Throw 50000, 'Inner Catch Error', 1;
    END CATCH

END TRY
BEGIN CATCH
    PRINT 'Outer Catch';
    PRINT ERROR_MESSAGE();
END CATCH

-- OUTPUT:
-- Outer Try
-- Inner Try
-- Inner Catch
-- Outer Catch
-- Inner Catch Error
Run Code Online (Sandbox Code Playgroud)