目前,我们仅在执行保持Include Actual Execution Plan - ON的存储过程时才面临该问题。否则,存储过程执行良好并按预期返回结果。这种行为的原因是什么?
我已经浏览过这个链接,但是这里的错误是不同的,因为它只发生在我们保持Include Actual Execution Plan - ON时。 链接 1 链接2
示例代码 (PROC1) -
CREATE PROCEDURE PROC1 (blah blah blah)
AS
BEGIN
BEGIN TRY
-------------
code
--------------
-----issue code-----
INSERT INTO #temptable (col1,col2,.....)
EXECUTE PROC2
-------------
code
--------------
END TRY
BEGIN CATCH
---------
RAISERROR(............);
END CATCH
END
示例代码 (PROC2) -
CREATE PROCEDURE PROC2
BEGIN
BEGIN TRY
---------------
code
---------------
SELECT COL1,COL2,COL3,..... FROM #innersptemptable
END TRY
BEGIN CATCH
--------------------
RAISERROR();
--------------------
END CATCH
END
注意: PROC2
返回完全相同的列数,我们在插入时注意了这些列数#temptable
如果需要任何进一步的信息,请告诉我。
环境 -
Microsoft SQL Server 2014 - 12.0.2000.8 (X64)
Feb 20 2014 20:04:26
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
Edit1: 当 PROC1 中发生错误并被捕获时,请注意ERROR_PROCEDURE()
返回 PROC2 的值,但 PROC2 再次运行正常,并在包含和不包含保留的实际执行计划的情况下给出预期的结果ON。
Edit2:当我们将本地临时表替换为全局临时表(我所说的临时表用于从 PROC2 传递结果集)在 PROC2 内部时,PROC1 的执行成功发生。
Edit3:当我们从内部 sp (PROC2) 中删除 TRY-CATCH 块并执行 PROC1 时,保持Include Actual Execution Plan - ON没有报告错误并且执行成功完成。