Get blocking processes chain using CTE
SQL Server 2005 introduced common type expressions. I find it really useful in writing recursive queries. Getting a blocking chain of spids is one way I use CTEs to check for the lead blocker.
WITH Blocking_chain( ROW, DEPTH, dbname, spid, hostname, program, waittime, blocked, sql_handle, stmt_start, stmt_end ) AS ( SELECT row_number() OVER(ORDER BY a.spid) [ROW], 0 [DEPTH] , DB_NAME(a.dbid) [dbname], a.spid, a.hostname, a.program_name, a.waittime, a.blocked, a.sql_handle, a.stmt_start, a.stmt_end FROM master.dbo.sysprocesses a INNER join master.dbo.sysprocesses b ON b.blocked = a.spid WHERE a.blocked = 0 and a.ecid = 0 UNION all SELECT b.ROW, b.DEPTH + 1 , DB_NAME(a.dbid), a.spid, a.hostname, a.program_name, a.waittime, a.blocked, a.sql_handle, a.stmt_start, a.stmt_end FROM master.dbo.sysProcesses a INNER join Blocking_chain b ON a.blocked = b.spid WHERE a.blocked > 0 and a.ecid = 0 ) SELECT p.*, CASE WHEN p.stmt_start=0 THEN t.TEXT WHEN p.stmt_end < 0 THEN SUBSTRING(t.TEXT, p.stmt_start/2, LEN(t.TEXT)/2 ) ELSE SUBSTRING(t.TEXT, p.stmt_start/2, (p.stmt_end-p.stmt_start)/2 ) END [STATEMENT] FROM Blocking_chain p cross apply sys.dm_exec_sql_text(p.sql_handle) t