Nested stored procedures and catch blocks - ERROR_PROCEDURE() issue












0















I have noticed something odd, and I am hoping someone in the community has an answer for me. I have noticed that when a stored procedure is nested it seems that the previous to last catch block has a weird bug with the ERROR_PROCEDURE() function where it returns the very last blocks procedure name. Since that was probable confusing, here is an example.



SET NOCOUNT ON

IF OBJECT_ID (N'tempdb..#spCatchTest1') IS NOT NULL BEGIN
DROP PROCEDURE #spCatchTest1
END
GO

CREATE PROCEDURE #spCatchTest1
AS
BEGIN
BEGIN TRY
EXEC #spCatchTest2
END TRY
BEGIN CATCH
PRINT 'CATCH EXPECTED=#spCatchTest1; ACTUAL=' + ERROR_PROCEDURE()
;THROW
END CATCH;
END
GO

IF OBJECT_ID (N'tempdb..#spCatchTest2') IS NOT NULL BEGIN
DROP PROCEDURE #spCatchTest2
END
GO

CREATE PROCEDURE #spCatchTest2
AS
BEGIN
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
PRINT 'CATCH EXPECTED=#spCatchTest2; ACTUAL=' + ERROR_PROCEDURE()
;THROW
END CATCH;
END
GO


EXEC #spCatchTest1


This will output:



CATCH EXPECTED=#spCatchTest2; ACTUAL=#spCatchTest2
CATCH EXPECTED=#spCatchTest1; ACTUAL=#spCatchTest2
Msg 8134, Level 16, State 1, Procedure #spCatchTest2, Line 6 [Batch Start Line 37]
Divide by zero error encountered.


As you can see on the second line, the top level catch incorrectly reported the procedure name. This appears to only affect the proc that is right before the error. If this chain were to be nested any deeper the function works properly. Has anyone else noticed this? Plus, it is a bug, correct?









share



























    0















    I have noticed something odd, and I am hoping someone in the community has an answer for me. I have noticed that when a stored procedure is nested it seems that the previous to last catch block has a weird bug with the ERROR_PROCEDURE() function where it returns the very last blocks procedure name. Since that was probable confusing, here is an example.



    SET NOCOUNT ON

    IF OBJECT_ID (N'tempdb..#spCatchTest1') IS NOT NULL BEGIN
    DROP PROCEDURE #spCatchTest1
    END
    GO

    CREATE PROCEDURE #spCatchTest1
    AS
    BEGIN
    BEGIN TRY
    EXEC #spCatchTest2
    END TRY
    BEGIN CATCH
    PRINT 'CATCH EXPECTED=#spCatchTest1; ACTUAL=' + ERROR_PROCEDURE()
    ;THROW
    END CATCH;
    END
    GO

    IF OBJECT_ID (N'tempdb..#spCatchTest2') IS NOT NULL BEGIN
    DROP PROCEDURE #spCatchTest2
    END
    GO

    CREATE PROCEDURE #spCatchTest2
    AS
    BEGIN
    BEGIN TRY
    SELECT 1/0
    END TRY
    BEGIN CATCH
    PRINT 'CATCH EXPECTED=#spCatchTest2; ACTUAL=' + ERROR_PROCEDURE()
    ;THROW
    END CATCH;
    END
    GO


    EXEC #spCatchTest1


    This will output:



    CATCH EXPECTED=#spCatchTest2; ACTUAL=#spCatchTest2
    CATCH EXPECTED=#spCatchTest1; ACTUAL=#spCatchTest2
    Msg 8134, Level 16, State 1, Procedure #spCatchTest2, Line 6 [Batch Start Line 37]
    Divide by zero error encountered.


    As you can see on the second line, the top level catch incorrectly reported the procedure name. This appears to only affect the proc that is right before the error. If this chain were to be nested any deeper the function works properly. Has anyone else noticed this? Plus, it is a bug, correct?









    share

























      0












      0








      0








      I have noticed something odd, and I am hoping someone in the community has an answer for me. I have noticed that when a stored procedure is nested it seems that the previous to last catch block has a weird bug with the ERROR_PROCEDURE() function where it returns the very last blocks procedure name. Since that was probable confusing, here is an example.



      SET NOCOUNT ON

      IF OBJECT_ID (N'tempdb..#spCatchTest1') IS NOT NULL BEGIN
      DROP PROCEDURE #spCatchTest1
      END
      GO

      CREATE PROCEDURE #spCatchTest1
      AS
      BEGIN
      BEGIN TRY
      EXEC #spCatchTest2
      END TRY
      BEGIN CATCH
      PRINT 'CATCH EXPECTED=#spCatchTest1; ACTUAL=' + ERROR_PROCEDURE()
      ;THROW
      END CATCH;
      END
      GO

      IF OBJECT_ID (N'tempdb..#spCatchTest2') IS NOT NULL BEGIN
      DROP PROCEDURE #spCatchTest2
      END
      GO

      CREATE PROCEDURE #spCatchTest2
      AS
      BEGIN
      BEGIN TRY
      SELECT 1/0
      END TRY
      BEGIN CATCH
      PRINT 'CATCH EXPECTED=#spCatchTest2; ACTUAL=' + ERROR_PROCEDURE()
      ;THROW
      END CATCH;
      END
      GO


      EXEC #spCatchTest1


      This will output:



      CATCH EXPECTED=#spCatchTest2; ACTUAL=#spCatchTest2
      CATCH EXPECTED=#spCatchTest1; ACTUAL=#spCatchTest2
      Msg 8134, Level 16, State 1, Procedure #spCatchTest2, Line 6 [Batch Start Line 37]
      Divide by zero error encountered.


      As you can see on the second line, the top level catch incorrectly reported the procedure name. This appears to only affect the proc that is right before the error. If this chain were to be nested any deeper the function works properly. Has anyone else noticed this? Plus, it is a bug, correct?









      share














      I have noticed something odd, and I am hoping someone in the community has an answer for me. I have noticed that when a stored procedure is nested it seems that the previous to last catch block has a weird bug with the ERROR_PROCEDURE() function where it returns the very last blocks procedure name. Since that was probable confusing, here is an example.



      SET NOCOUNT ON

      IF OBJECT_ID (N'tempdb..#spCatchTest1') IS NOT NULL BEGIN
      DROP PROCEDURE #spCatchTest1
      END
      GO

      CREATE PROCEDURE #spCatchTest1
      AS
      BEGIN
      BEGIN TRY
      EXEC #spCatchTest2
      END TRY
      BEGIN CATCH
      PRINT 'CATCH EXPECTED=#spCatchTest1; ACTUAL=' + ERROR_PROCEDURE()
      ;THROW
      END CATCH;
      END
      GO

      IF OBJECT_ID (N'tempdb..#spCatchTest2') IS NOT NULL BEGIN
      DROP PROCEDURE #spCatchTest2
      END
      GO

      CREATE PROCEDURE #spCatchTest2
      AS
      BEGIN
      BEGIN TRY
      SELECT 1/0
      END TRY
      BEGIN CATCH
      PRINT 'CATCH EXPECTED=#spCatchTest2; ACTUAL=' + ERROR_PROCEDURE()
      ;THROW
      END CATCH;
      END
      GO


      EXEC #spCatchTest1


      This will output:



      CATCH EXPECTED=#spCatchTest2; ACTUAL=#spCatchTest2
      CATCH EXPECTED=#spCatchTest1; ACTUAL=#spCatchTest2
      Msg 8134, Level 16, State 1, Procedure #spCatchTest2, Line 6 [Batch Start Line 37]
      Divide by zero error encountered.


      As you can see on the second line, the top level catch incorrectly reported the procedure name. This appears to only affect the proc that is right before the error. If this chain were to be nested any deeper the function works properly. Has anyone else noticed this? Plus, it is a bug, correct?







      sql-server exception





      share












      share










      share



      share










      asked 6 mins ago









      SpaceGhost440SpaceGhost440

      11818




      11818






















          0






          active

          oldest

          votes












          Your Answer








          StackExchange.ready(function() {
          var channelOptions = {
          tags: "".split(" "),
          id: "182"
          };
          initTagRenderer("".split(" "), "".split(" "), channelOptions);

          StackExchange.using("externalEditor", function() {
          // Have to fire editor after snippets, if snippets enabled
          if (StackExchange.settings.snippets.snippetsEnabled) {
          StackExchange.using("snippets", function() {
          createEditor();
          });
          }
          else {
          createEditor();
          }
          });

          function createEditor() {
          StackExchange.prepareEditor({
          heartbeatType: 'answer',
          autoActivateHeartbeat: false,
          convertImagesToLinks: false,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: null,
          bindNavPrevention: true,
          postfix: "",
          imageUploader: {
          brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
          contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
          allowUrls: true
          },
          onDemand: true,
          discardSelector: ".discard-answer"
          ,immediatelyShowMarkdownHelp:true
          });


          }
          });














          draft saved

          draft discarded


















          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f233551%2fnested-stored-procedures-and-catch-blocks-error-procedure-issue%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          0






          active

          oldest

          votes








          0






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes
















          draft saved

          draft discarded




















































          Thanks for contributing an answer to Database Administrators Stack Exchange!


          • Please be sure to answer the question. Provide details and share your research!

          But avoid



          • Asking for help, clarification, or responding to other answers.

          • Making statements based on opinion; back them up with references or personal experience.


          To learn more, see our tips on writing great answers.




          draft saved


          draft discarded














          StackExchange.ready(
          function () {
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fdba.stackexchange.com%2fquestions%2f233551%2fnested-stored-procedures-and-catch-blocks-error-procedure-issue%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown





















































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown

































          Required, but never shown














          Required, but never shown












          Required, but never shown







          Required, but never shown







          Popular posts from this blog

          SQL Server 17 - Attemping to backup to remote NAS but Access is denied

          Always On Availability groups resolving state after failover - Remote harden of transaction...

          Restoring from pg_dump with foreign key constraints