L'Enterprise Manager di SQL Server 2000 permette di monitorare e visualizzare informazioni sulle attività in esecuzione:
Utilizzando la finestra Current Activity in SQL Server Enterprise Manager, si può eseguire il monitoraggio di una istanza SQL Server verificando la tipologia delle attività eseguite sul sistema, come ad esempio:
- Transazioni bloccate e bloccanti
- Utenti correntemente connessi ad un'istanza di SQL Server e l'ultimo comando eseguito
- Blocchi in essere
In alcune situazioni però, durante la consultazione della finestra Current Activity, viene restituito il seguente messaggio di errore:

L'errore 1222 - Lock request time out period exceeded evidenzia l'impossibilità di visualizzare le attività correnti sull'istanza SQL Server.
Quando si ha la necessità di consultare la finestra Current Activity è tipicamente perché gli utenti vi hanno segnalato un blocco. In questi casi si ha poco tempo per analizzare la causa del problema e l'obiettivo è quello di risolvere il blocco nel minor tempo possibile.
Ho pensato di sviluppare la funzione FN_LOCK_INFO() con cui posso consultare i processi utilizzando SQL Query Analyzer in alternativa all'Enterprise Manager qualora il Current Activity risulti essere bloccato.
/* DROP Inline table-valued function */
IF OBJECT_ID('FN_LOCK_INFO') IS NOT NULL
DROP FUNCTION FN_LOCK_INFO
GO
/* Creazione Inline table-valued function */
CREATE FUNCTION [DBO].[FN_LOCK_INFO]()
RETURNS TABLE
AS RETURN
/*
Descrizione: Inline table-valued function per l'interrogazione delle tabelle di sistema syslockinfo e sysprocesses
*/
(
SELECT p.spid,
p.kpid,
p.blocked,
p.waittime,
p.dbid,
(SELECT d.name FROM master.dbo.sysdatabases d WHERE d.dbid=p.dbid) as dbname,
p.open_tran,
p.hostname,
p.program_name,
p.nt_domain,
p.nt_username,
p.loginame,
li.rsc_text,
li.rsc_objid,
(SELECT o.name FROM sysobjects o WHERE o.id=li.rsc_objid) as local_objname,
(SELECT o.name FROM master.dbo.sysobjects o WHERE o.id=li.rsc_objid) as master_objname,
CASE li.req_mode
WHEN 0 THEN 'NULL'
WHEN 1 THEN 'Sch-S (Schema stability)'
WHEN 2 THEN 'Sch-M (Schema modification)'
WHEN 3 THEN 'S (Shared)'
WHEN 4 THEN 'U (Update)'
WHEN 5 THEN 'X (Exclusive)'
WHEN 6 THEN 'IS (Intent Shared)'
WHEN 7 THEN 'IU (Intent Update)'
WHEN 8 THEN 'IX (Intent Exclusive)'
WHEN 9 THEN 'SIU (Shared Intent Update)'
WHEN 10 THEN 'SIX (Shared Intent Exclusive)'
WHEN 11 THEN 'UIX (Update Intent Exclusive)'
WHEN 12 THEN 'BU (Used by bulk operations)'
WHEN 13 THEN 'RangeS_S (Shared Key-Range and Shared Resource lock)'
WHEN 14 THEN 'RangeS_U (Shared Key-Range and Update Resource lock)'
WHEN 15 THEN 'RangeI_N (Insert Key-Range and Null Resource lock)'
WHEN 16 THEN 'RangeI_S (Key-Range Conversion lock)'
WHEN 17 THEN 'RangeI_U (Key-Range Conversion lock)'
WHEN 18 THEN 'RangeI_X (Key-Range Conversion lock)'
WHEN 19 THEN 'RangeX_S (Key-Range Conversion lock)'
WHEN 20 THEN 'RangeX_U (Key-Range Conversion lock)'
WHEN 21 THEN 'RangeX_X (Exclusive Key-Range and Exclusive Resource lock)'
END as req_mode
FROM master.dbo.sysprocesses p
LEFT OUTER JOIN master.dbo.syslockinfo li ON li.req_spid=p.spid
)
Avendo utilizzato direttamente le tabelle di sistema, la funzione non è compatibile con SQL Server 2005.