• set nocount on;

    declare @bufferSPID table (EventType nvarchar(30), Parameter smallint, EventInfo nvarchar(4000));

    declare @bufferBLOCKED table (EventType nvarchar(30), Parameter smallint, EventInfo nvarchar(4000));

    declare @ret table (spid int, spidEventInfo nvarchar(4000), blocked int, blockedEventInfo nvarchar(4000), hostname varchar(100), loginame varchar(100));

    DECLARE @ospid int,

    @oblocked int,

    @ohostname varchar(100),

    @ologinname varchar(100),

    @spidEventInfo nvarchar(4000),

    @blockedEventInfo nvarchar(4000)

    DECLARE indexCursor CURSOR FOR

    select spid, blocked, hostname, loginame

    from sys.sysprocesses

    where [status] = 'suspended' -- tasks that are waiting for I/O to complete

    OPEN indexCursor

    FETCH NEXT FROM indexCursor INTO @ospid, @oblocked, @ohostname, @ologinname

    WHILE (@@FETCH_STATUS = 0)

    BEGIN

    delete from @bufferSPID

    delete from @bufferBLOCKED

    if(@ospid <> 0) insert into @bufferSPID exec ('DBCC INPUTBUFFER(' + @ospid + ')');

    if(@oblocked <> 0) insert into @bufferBLOCKED exec ('DBCC INPUTBUFFER(' + @oblocked + ')');

    select @spidEventInfo= EventInfo from @bufferSPID

    select @blockedEventInfo = EventInfo from @bufferBLOCKED

    insert into @ret (spid, spidEventInfo, blocked, blockedEventInfo, hostname, loginame)

    select @ospid, @spidEventInfo, @oblocked, @blockedEventInfo, @ohostname, @ologinname

    FETCH NEXT FROM indexCursor into @ospid, @oblocked, @ohostname, @ologinname

    END

    CLOSE indexCursor

    DEALLOCATE indexCursor

    select * from @ret