Naru’s

Family, Technology, Life in general

Get blocking processes chain using CTE

without comments

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

Written by Navket

April 10th, 2009 at 9:00 am

Posted in Uncategorized