home
This displays various attributes of connections by status
Author Nigel Rivett
Do you often need to find out what is being processed on your server?
How long each process has been running, what the command was, what is blocking, how much i/o it is causing?
This stored procedure will display the last command executed and other attributes for all spids or those with a given status.
The default status is 'runnable' as that is the usually requirement.
By calling the procedure with 'all' all spid are displayed.
By calling the proceduer with a spid just that spid is displayed.
By calling the proceduer with a 'blk' all blocked and blocking spids are displayed.
To keep a record or what is happenning on your server output the result of this procedure to a table and schedule the call.
Note: Sometimes the status displayed is not that requested due to the delay between getting the list of spids and the delay.
Sample output
blk spid physical_io status last_batch cmd command login_time HostName
---- ---- -------------------- ------------ ----------------------- ---------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------- --------------------------------------------------------------------------------------------------------------------------------
1 0 background 2003-06-06 20:06:36.180 LAZY WRITER 2003-06-06 20:06:36.180
10 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
11 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
12 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
13 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
3 0 background 2003-06-06 20:06:36.180 SIGNAL HANDLER 2003-06-06 20:06:36.180
4 0 background 2003-06-06 20:06:36.180 LOCK MONITOR 2003-06-06 20:06:36.180
5 1 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
6 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
8 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
9 0 background 2003-06-06 20:06:36.180 TASK MANAGER NULL 2003-06-06 20:06:36.180
54 21 runnable 2003-06-07 00:11:05.390 SELECT exec sp_nrSpidByStatus 'all' -- all spids|||| 2003-06-07 00:10:40.227 LAPTOP8200
2 0 sleeping 2003-06-06 20:06:36.180 LOG WRITER 2003-06-06 20:06:36.180
52 23 sleeping 2003-06-07 00:05:23.440 AWAITING COMMAND test..sp_sproc_columns;1 2003-06-07 00:05:05.413 LAPTOP8200
53 0 sleeping 2003-06-07 00:10:10.573 AWAITING COMMAND use [test] 2003-06-07 00:10:00.070 LAPTOP8200
7 0 sleeping 2003-06-06 20:06:36.180 CHECKPOINT SLEEP 2003-06-06 20:06:36.180
if exists (select * from sysobjects where id = object_id(N'[dbo].[sp_nrSpidByStatus]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[sp_nrSpidByStatus]
GO
Create procedure sp_nrSpidByStatus
@status varchar(20) = 'runnable'
as
/*
exec sp_nrSpidByStatus -- all spids whith status runnable
exec sp_nrSpidByStatus 'sleeping' -- all spids whith status sleeping
exec sp_nrSpidByStatus 'background' -- all spids whith status background
exec sp_nrSpidByStatus 'sleeping' -- all spids whith status sleeping
exec sp_nrSpidByStatus 'all' -- all spids
exec sp_nrSpidByStatus 'blk' -- all blocked or blocking spids
exec sp_nrSpidByStatus '74' -- an individual spid - also gives subthreads
select * from master..sysprocesses where spid = 56
*/
set transaction isolation level read uncommitted
set nocount on
declare @cmd varchar(1000)
declare @buf varchar(1000) ,
@id int ,
@spid int ,
@maxSpid int
create table #spid (spid int, command varchar(1000) null)
create table #temp (x varchar(100), y int, s varchar(1000), id int identity (1,1))
create table #spids (spid int)
if isnumeric(@status) = 1
begin
insert #spids select @status
end
else if @status = 'blk'
begin
insert #spids
select spid from master..sysprocesses where blocked <> 0
union
select blocked from master..sysprocesses where blocked <> 0
end
else
begin
insert #spids select spid from master..sysprocesses where (status = @status or @status = 'all') and ecid = 0
end
select @spid = 0 ,
@maxSpid = max(spid)
from #spids
while @spid < @maxSpid
begin
select @spid = min(spid) from #spids where spid > @spid
select @cmd = 'dbcc inputbuffer (' + convert(varchar(10),@spid) + ')'
delete #temp
insert #temp
exec (@cmd)
select @id = 0 ,
@buf = ''
select @buf = @buf + replace(replace(s,char(10),'|'),char(13),'|')
from #temp
insert #spid
select @spid, @buf
end
select blk = case when s.blocked <> 0 then convert(varchar(3),s.blocked) else ' ' end ,
spid = convert(varchar(4),#spid.spid) ,
s.physical_io ,
status = left(s.status,12) ,
last_batch = convert(varchar(23),s.last_batch,121) ,
s.cmd ,
#spid.command ,
login_time = convert(varchar(23),s.login_time,121) ,
s.HostName
from #spid ,
master..sysprocesses s
where s.spid = #spid.spid
and (ecid = 0 or isnumeric(@status) = 1)
order by s.status, #spid.spid
drop table #spid
drop table #temp
go
home