Bunun için aşağıdaki gibi bir şablon kullanabiliriz;
1- ExecInfoTable Tablosu:
CREATE TABLE ExecInfoTable(
SpName VARCHAR(64) NOT NULL,
LastSessionID INT
NOT NULL
)
Bu tabloda istediğimiz SP mizin anlık çalışma bilgisini saklıyor olacağız.
Her oluşturduğumuz SP için ExecInfoTable tablosuna bir kayıt insert ederiz. Bizim örneğimizde SP mizin ismi sp_ExecManagementTest olacak.
INSERT INTO ExecInfoTable(SpName, LastSessionID) VALUES('sp_ExecManagementTest', 0)
SP miz çalışmaya başladığında SessionID sini @@SPID distem değişkeninden alarak ExecInfoTable tablosuna kaydedeceğiz
2- SessionID Aktiflik Kontolü:
SQL Server in çalışmakta olan Exec işlemlerinin SessionID lerini sakladığı bir sistem tablosu var. Bu tablonun ismi sys.dm_exec_requests dir.
Aşağıdaki sorgu ile sistemde aktif çalışan Exec işlemlerinin SessionID lerini görebiliriz.
SELECT session_id FROM sys.dm_exec_requests WHERE status IN ('running', 'suspended', 'pending', 'runnable')
3- EXEC Management Şablonu:
SP mize aşağıdaki şablonu uygulayarak, kontrollü çalışmasını sağlamış oluyoruz:
CREATE PROCEDURE sp_ExecManagementTest
AS
BEGIN
DECLARE
@LastSessionID INT =
0
SELECT
@LastSessionID = LastSessionID FROM ExecInfoTable WITH(NOLOCK) WHERE SpName = 'sp_ExecManagementTest'
IF EXISTS(SELECT 1 FROM sys.dm_exec_requests WHERE
status IN ('running', 'suspended', 'pending', 'runnable') AND session_id =
@LastSessionID)
BEGIN
PRINT
'sp_ExecManagementTest bitmeden tekrar çalýþtýrýlamaz!'
GOTO
SPEnd
END
ELSE
UPDATE
ExecInfoTable SET LastSessionID = @@SPID WHERE SpName = 'sp_ExecManagementTest'
-- Bu noktadan
sonra SP mizin asıl kodları başlar
WAITFOR DELAY '00:00:10'
PRINT 'sp_ExecManagementTest
çalışmas bitti'
SPEnd:
END
4- Test:
SP mizi farklı pencerelerde(farklı session lar altında) çalıştırmayı denersek sonuç aşağıdaki gibi olacaktır: