У меня есть процедура блокировки сеанса, которая выполняет действие, когда одна процедура выполняется в одном сеансе, если та же самая процедура выполняет другой сеанс, она не будет выполняться до завершения первого сеанса
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