需要了解的信息SQL Server 2008 R2 Express存储过程当前正在执行或未执行

时间:2013-11-20 08:33:35

标签: sql-server stored-procedures sql-server-2008r2-express

我有一个存储过程GenerateAttendance,执行时间大约需要3-4分钟。同时我的程序请求执行相同的存储过程。

如果当前正在运行,我想限制我的程序执行它。在SQL Server 2008 R2 Express中,有任何方法可以在请求再次执行之前找到当前正在执行的存储过程或者是什么。

我尝试过以下选项,但它对我不起作用

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

2 个答案:

答案 0 :(得分:0)

有两个存储过程用于此目的:sp_getapplocksp_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