0

У меня хранимая процедура GenerateAttendance, время выполнения займет около 3-4 минут. Тем временем моя программа запрашивает одну и ту же хранимую процедуру для выполнения.Что нужно знать SQL Server 2008 R2 Express Хранимая процедура выполняется или не выполняется до выполнения

Я хочу ограничить свою программу от ее выполнения, если она в данный момент запущена. Есть ли способ, в SQL Server 2008 R2 Express, найти хранимую процедуру в настоящее время или что, прежде чем запрашивать ее повторное выполнение.

Я попытался ниже вариант, но он не работает для меня

SELECT OBJECT_NAME(@@PROCID) 
select OBJECT_SCHEMA_NAME(@@PROCID) 

ответ

1

Есть 2 хранимая процедура, которые используются для этого: sp_getapplock и sp_releaseapplock.

Измените хранимую процедуру таким образом:

ALTER PROCEDURE GenerateAttendance 
AS 
BEGIN 
    -- Acquire lock 
    DECLARE @result int 
    EXEC @result = sp_getapplock @Resource = 'GenerateAttendance', @LockMode = 'Exclusive' 
    IF @result NOT IN (0,1) 
     RAISERROR ('Cannot acquire lock', 16, 1) 

    BEGIN TRY 
     -- Actual code of your SP here 

    END TRY 
    BEGIN CATCH 
     -- Release lock 
     EXEC @result = sp_releaseapplock @Resource = 'GenerateAttendance' 
     IF @result != 0 
      PRINT 'Cannot release lock' 
    END CATCH 
END 
GO 
+0

спасибо Dd2 Я хочу, чтобы это было очень просто, если мой sp в настоящее время выполняется, это не позволит мне выполнить снова. как я могу достичь этого из вышеприведенного кода – gbbosmiya

0

Добавлено более простое решение, как @gbbosmiya просил.

+0

он дает ошибку: Msg 1033, уровень 15, состояние 1, строка 7 Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, кроме TOP или FOR XML также указывается. – gbbosmiya

Смежные вопросы