来自Here
TRY…CATCH 构造不能跨越多个批次。尝试...抓住
构造不能跨越多个 Transact-SQL 语句块。为了
例如,一个 TRY…CATCH 构造不能跨越两个 BEGIN…END 块
Transact-SQL 语句,并且不能跨越 IF...ELSE 构造。
这意味着如果Error 出现在内部块中,嵌套的Try...Catch 块不会影响外部Try..Catch 块代码。
这里你想给我们一个查询到另一个的结果,所以,你最好使用单个Try..Catch块
原因
如果包含在 TRY 块中的代码没有错误,
当 TRY 块中的最后一条语句完成运行时,控制
在关联的 END CATCH 之后立即传递给语句
陈述。 如果包含在 TRY 中的代码有错误
块,控制传递给关联的 CATCH 中的第一条语句
阻止。如果 END CATCH 语句是存储的最后一条语句
过程或触发器,控制被传递回语句
调用存储过程或触发触发器。
所以,在这种情况下,第一次错误发生后没有额外的执行恐惧。
示例:
使用嵌套Try...Catch
BEGIN try
declare @param1 as int
BEGIN Try
set @param1='gkjk'
select @param1
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
BEGIN TRY
select 'hello','i m in',200
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
它会给你两个结果集。
使用单个Try...Catch
BEGIN TRY
declare @param1 as int
set @param1='gkjk'
select @param1
select 'hello','i m in',200
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_PROCEDURE() as ErrorProcedure,
ERROR_LINE() as ErrorLine,
ERROR_MESSAGE() as ErrorMessage;
END CATCH
这会给你一个单一的结果。