Как выполнить хранимую процедуру с другой хранимой процедурой? - PullRequest
1 голос
/ 07 июня 2019

У меня есть процедура блокировки сеанса, которая выполняет действие, когда одна процедура выполняется в одном сеансе, если та же самая процедура выполняет другой сеанс, она не будет выполняться до завершения первого сеанса

EXEC dbo.[system-LockProcedure]'dbo.usp_Test1' 

Это работаетхорошо, и у меня нет проблем, но когда я хочу выполнить процедуру с входными параметрами, я получаю ошибку:

DECLARE @threadid INT = 0;

EXEC [util].[system-LockProcedure] N'[dbo].[usp_Test1] @threadid=@threadid', 
                       N'@threadid INT', 
                         @threadid=@threadid

Ошибка:

[dbo]. [usp_Test1] ожидаетпараметр @threadid, который не указан.

Когда я выполняю процедуру без входных параметров, она работает нормально, а когда я хочу выполнить процедуру с входными параметрами, она выдает ошибку.

Пожалуйста, предложите, какисправить это.

Процедура блокировки системы:

CREATE Procedure [dbo].[system-LockProcedure] @procname varchar(200)

AS 

--BEGIN TRAN
BEGIN

DECLARE @lockreturn int,
        @lockresource varchar(200)               --sysname


SELECT @lockresource =    @procname    



              -- The below line will try to acquire an exclusive lock on the PROC for the session, If the Proc is already in execution the @lockreturn value will be > 0

                 EXEC @lockreturn = sp_getapplock @lockresource, @LockMode = 'Exclusive', @LockOwner = 'Session'  , @LockTimeout = 100
                                                                Print @lockreturn 

                 IF @lockreturn <> 0
                 BEGIN

                        RAISERROR ('Another instance of the procedure is already running', 16, 1)
                                                                                                RETURN
                 END

                -- The Code to be executed goes here. All the core logic of the proc goes here..

              Print 'Procedure Execution Started for user: ' +  cast (CURRENT_USER as nvarchar(20))+ ' for session: ' + cast (@@SPID as nvarchar(10))

                -- This is just to make the system wait for 30 seconds and make sure if there is any concurrent execution triggered will fail

                                                                exec @lockresource

              Print 'Procedure Execution Ended for user: ' +  cast (CURRENT_USER as nvarchar(20))+ ' for session: ' + cast (@@SPID as nvarchar(10))

                                                  Print @lockreturn

                -- This is to release the lock once the SP code is ran completely

                                                EXEC sp_releaseapplock @lockresource , 'Session'

                                                 -- END TRY


    END

Ответы [ 2 ]

2 голосов
/ 07 июня 2019

Попробуйте это:

DECLARE @threadid INT = 0;

DECLARE @ExecuteString NVARCHAR(MAX) = N'[dbo].[usp_Test1] @threadid= ' + CAST(@threadid AS VARCHAR(4)) + ';'

EXEC [util].[system-LockProcedure] @ExecuteString;
0 голосов
/ 07 июня 2019

До конца хранимой процедуры вы используете имя процедуры, которую хотите выполнить, и соответствующий ей параметр, например:

Alter procedure Procedure1
As
begin
  select * from TableName
  Exec Procedure2 
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...