我有一个存储过程GenerateAttendance
,执行时间大约需要3-4分钟。同时我的程序请求执行相同的存储过程。
如果当前正在运行,我想限制我的程序执行它。在SQL Server 2008 R2 Express中,有任何方法可以在请求再次执行之前找到当前正在执行的存储过程或者是什么。
我尝试过以下选项,但它对我不起作用
SELECT OBJECT_NAME(@@PROCID)
select OBJECT_SCHEMA_NAME(@@PROCID)
答案 0 :(得分:0)
有两个存储过程用于此目的: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
答案 1 :(得分:0)
添加了一个更简单的解决方案,正如@gbbosmiya所要求的那样。
IF EXISTS(
SELECT deqs.last_execution_time AS [Time], dest.TEXT AS [Query]
FROM
sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE dest.TEXT LIKE '%GenerateAttendance%'
ORDER BY deqs.last_execution_time DESC)
BEGIN
PRINT 'This stored procedure is currently executing'
END
ELSE
BEGIN
-- Execute stored proc
END
GO