如何到达“外部捕获块,删除此处插入的任何记录?” 当我在两个内部 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)
我同意@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)
| 归档时间: |
|
| 查看次数: |
6585 次 |
| 最近记录: |