• Ok, this is not all that pretty, but it at least returns the right values. I'm sure there's a more efficient way of acquiring them, though. It creates a temporary table that eventually contains a row for each Blocking SPID/Blocked SPID combination, including "indirect" blocks, and then counts them per blocking SPID. Hopefully something like this (or a more efficient suggestion from someone else) will help you get what you want.

    SELECT Blocked AS Blocker, spid as Blocked INTO #BlockedSpids FROM master.dbo.sysprocesses

    WHERE blocked>0

    WHILE EXISTS (SELECT Headblocker.Blocker,Tailblocked.Blocked FROM #BlockedSpids AS HeadBlocker

    inner join #BlockedSpids AS Tailblocked

    ON Headblocker.Blocked=Tailblocked.blocker

    WHERE NOT EXISTS (SELECT * FROM #BlockedSpids AS cmpr WHERE Headblocker.blocker=cmpr.blocker and Tailblocked.blocked=cmpr.blocked)

    )

    BEGIN

    INSERT into #BlockedSpids

    SELECT distinct Headblocker.Blocker,Tailblocked.Blocked FROM #BlockedSpids AS HeadBlocker

    inner join #BlockedSpids AS Tailblocked

    ON Headblocker.Blocked=Tailblocked.blocker

    WHERE NOT EXISTS (SELECT * FROM #BlockedSpids AS cmpr WHERE Headblocker.blocker=cmpr.blocker and Tailblocked.blocked=cmpr.blocked)

    END

    SELECT Blocker, COUNT(Blocked) AS AllBlocked FROM #BlockedSpids

    GROUP BY Blocker

    I hope this helps!