Получение вывода одной хранимой процедуры, вызываемой в другой с использованием TSQL - PullRequest
0 голосов
/ 04 марта 2020

У меня есть две хранимые процедуры spParent и spParentChild. spParent вызывает spParentChild. После SP:

CREATE PROCEDURE [dbo].[spParent]
        @isApproved varchar(max) = 'TEST',
        @ApplicationDBName varchar(100) = 'secDB',
        @ApplicationInsertSPName varchar(100) = 'spParentChild',
        @resultP varchar(max) output
AS
BEGIN
    BEGIN TRY
        SET NOCOUNT ON;
        IF @resultP <> ''
        BEGIN
            RAISERROR('An error occurred in the parent SP.', 18, 0)
        END

        DECLare @resultCC varchar(max)
        DECLARE @SP_Call Varchar(MAX)
        SET @SP_Call = 'exec spParentChild ''1'', @resultCC output'
        EXEC @SP_Call 
        select @resultCC
    END TRY
    BEGIN CATCH
        Declare @ErrMessage Varchar(max)
        Declare @ErrState Varchar(max)
        Declare @ErrLine Varchar(max)

        select @ErrMessage=ErrorMessage, @ErrLine=ErrorLine, @ErrState=ErrorState  from fnGetError()

        IF @ErrMessage is not Null
        BEGIN
            SELECT @resultP = @ErrMessage
            SELECT @resultCC
        END
        ELSE
        BEGIN
            SELECT @resultP = 'An unknown error occurred.'
            raiserror(@resultP,18,0)
        END
    END CATCH
END

CREATE PROCEDURE [dbo].[spParentChild]
        @isApproved varchar(max) = 'TEST',
        @resultC varchar(max)   output  
AS
BEGIN
    BEGIN TRY
        SET NOCOUNT ON;
        RAISERROR('An error occurred in the child SP.', 18, 0)
    END TRY
    BEGIN CATCH
        Declare @ErrMessage Varchar(max)
        Declare @ErrState Varchar(max)
        Declare @ErrLine Varchar(max)

        select @ErrMessage=ErrorMessage, @ErrLine=ErrorLine, @ErrState=ErrorState  from fnGetError()

        IF @ErrMessage is not Null
        BEGIN
            SET @resultC = @ErrMessage
        END
        ELSE
        BEGIN
            SELECT @resultC = 'An unknown error occurred.'
        END
    END CATCH
END

Как видите вызовы spParent spParentChild. Что мне нужно, это использовать T SQL для вызова, но он не работает. Если я использую следующее, все работает нормально, но мне нужно T SQL:

EXEC spParentChild 1, @resultCC output

Может ли кто-нибудь помочь мне увидеть, что я делаю неправильно, или это вообще возможно?

Заранее спасибо.

Годфри

1 Ответ

0 голосов
/ 05 марта 2020

Для тех, у кого есть похожая проблема или мне нужно, я выкладываю это решение, которое я создал Это может звучать так, как будто это сумасшествие, но, пожалуйста, поверьте, когда я скажу вам, что мне это нужно, а фактические SP, которые нуждаются в этом, слишком длинные для публикации.

spParentChild не изменился и остается таким же, как указано выше. spParent изменяется, как показано ниже. В результате spParent вызывает spParentChild. В его случае, если в spParentChild возникает ошибка, сообщение передается spParent в выходном параметре.

Я постараюсь ответить на любые вопросы, если они у вас возникнут. Ниже приводится spParent:

ALTER PROCEDURE [dbo].[spParent]
        @isApproved varchar(max) = 'TEST',
        @ApplicationDBName varchar(100) = 'SecDB',
        @ApplicationInsertSPName varchar(100) = 'spParentChild',
        @resultP varchar(max) output
AS
BEGIN
    BEGIN TRY
        SET NOCOUNT ON;
        IF @resultP <> ''
        BEGIN
            RAISERROR('An error occurred in the parent SP.', 18, 0)
        END

        DECLARE @params NVarChar(max)
        SET @params = '@resultCC VarChar(100) OUTPUT' -- OUTPUT Parameter for the called child SP
        DECLARE @SP_Call NVarchar(MAX) -- sp_executesql requires NVarChar
        SET @SP_Call = '[' + @ApplicationDBName + '].[dbo].[' + @ApplicationInsertSPName + '] ' + ' ''1'', @resultCC OUTPUT' -- ResultCC is the output parameter for the sp_executesql
        EXEC sp_executesql @SP_Call, @params, @resultCC = @resultP OUTPUT -- Assign the value to the output parameter of this SP

        -- EXEC spParentChild 1, @resultCC output -- THE ABOVE 5 LINES OF CODE ARE EQUAL TO THIS IS A HARDCODED CALL
        if @resultP <> ''
        BEGIN
            SELECT @resultP [Returned Value]
        END

    END TRY
    BEGIN CATCH
        Declare @ErrMessage Varchar(max)
        Declare @ErrState Varchar(max)
        Declare @ErrLine Varchar(max)

        select @ErrMessage=ErrorMessage, @ErrLine=ErrorLine, @ErrState=ErrorState  from fnGetError()

        IF @ErrMessage is not Null
        BEGIN
            SELECT @resultP = @ErrMessage
            SELECT @ErrMessage
        END
        ELSE
        BEGIN
            SELECT @resultP = 'An unknown error occurred.'
            SELECT 'bbb'
            raiserror(@resultP,18,0)
        END
    END CATCH
END

Надеюсь, это поможет кому-то в такой нужде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...