Find out if the stored procedure is already running
sql-server, sql-server-2012
Solution
Use the built-in application locks. SQL Server makes sure the lock is released if the session or server shuts down unexpectedly. Be aware that the lock must be acquired inside a transaction.
ALTER PROCEDURE usp_ProcessCustomers
AS
BEGIN
BEGIN TRANSACTION
declare @Lock int
EXEC @Lock = sp_getapplock @Resource = 'ProcessCustomers',
@LockMode = 'Exclusive'
IF (@Lock < 0) -- already locked by another process
RETURN;
-- Do processing here
-- Do processing here
EXEC sp_releaseapplock @Resource = 'ProcessCustomers'
COMMIT TRANSACTION
END
Problem
Here is my stored procedure which I am running in SQL Server 2012. ``` ALTER PROCEDURE usp_ProcessCustomers AS BEGIN IF EXISTS (SELECT 1 FROM RunningProcesses WHERE ProcessId = 1 AND IsRunning = 1) RETURN; UPDATE RunningProcesses SET IsRunning = 1 WHERE ProcessId = 1 -- Do processing here -- Do processing here UPDATE RunningProcesses SET IsRunning = 0 WHERE ProcessId = 1 END GO ``` This stored procedure can be triggered from several places in the app. Even the DBA can trigger the stored procedure using SSMS if needed. So far so good. The issue is that if something goes wrong or if the DBA cancels the execution of the stored procedure then the `IsRunning` value in `RunningProcesses` is never updated back to 0. So the system always thinks that the stored procedure is running even when its not. I found the following script on the web which checks if a script is running. ``` SELECT r.*, t.text FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t WHERE r.status IN (N'Suspended', N'Running', N'Runnable', N'Pending') ``` Would it be a good approach to use the above script to find out whether the stored procedure is already running or not? If its already running then I will exit the stored procedure using the `RETURN` keyword. If this is not a good idea then what would be the best way to fix this problem.