Example SQL Server Active Users in Database

Description:
Example to show the active users in a SQL Server Database,
Check the example below:

------------------------------------------------------------------------------------------------------

select	('kill '+ cast(spid as varchar(10))) as [kill proces],
        sql_handle as [sql handle],
        convert(varchar(8), dateadd(second, datediff(ss, a.last_batch, getdate()), 0), 108) as [duration last_batsch],
        last_batch as [start_time last_batch],
        left(cmd, 12) as [command],
		left(loginame,20) as [login name],
		cpu as cpu,
		physical_io as [physical_io],
		memusage as [memory usage],
		blocked as [blocked process],
		b.wait_type as [wait type],
		b.resource_description as [resource description],
		spid as spid,
		kpid as kpid,
        login_time as [login time],
        getdate() as [current time]
from	master..sysprocesses a inner join  sys.dm_os_waiting_tasks b on a.spid = b.session_id 
where	loginame not in ('sa') and cmd <> 'awaiting command'
order by last_batch desc

/*
Active Users in Database (Waiting on ....)
*/

select	('kill '+ cast(spid as varchar(10))) as [kill proces],
        sql_handle as [sql handle],
        convert(varchar(8), dateadd(second, datediff(ss, a.last_batch, getdate()), 0), 108) as [duration last_batsch],
        last_batch as [start_time last_batch],
        left(cmd, 12) as [command],
		left(loginame,20) as [login name],
		cpu as cpu,
		physical_io as [physical_io],
		memusage as [memory usage],
		blocked as [blocked process],
		b.wait_type as [wait type],
		b.resource_description as [resource description],
		spid as spid,
		kpid as kpid,
        login_time as [login time],
        getdate() as [current time]
from	master..sysprocesses a inner join  sys.dm_os_waiting_tasks b on a.spid = b.session_id 
where	loginame not in ('sa') and wait_type = 'pageiolatch_sh' -- waiting for some page to be brought into memory (from database files on disk). 
and     spid <> @@spid
order by [duration last_batsch] asc

/*
Active Sessions in Database (Currently execute on ....)
*/

select  d.name as [dbname],
        'kill ' + convert (varchar(10), a.session_id) as [kill proces],
        a.sql_handle as [sql handle],
        convert(varchar(8), dateadd(second, datediff(ss, a.start_time, getdate()), 0), 108) as [duration starttime],
        a.start_time as [start_time last_batch],
        --datediff(ss, a.start_time, getdate()) as [seconds],
        --a.total_elapsed_time / 1000.0 as [elapsedtime],
        a.command as [command],
        a.blocking_session_id as [blocked session id],
        m.dop as [degree of parallelism],
        b.text as [sql text],
        substring(b.text, a.statement_start_offset / 2, case when (a.statement_end_offset - a.statement_start_offset) / 2 > 0 then (a.statement_end_offset - a.statement_start_offset) / 2  else 1 end ) as [stmt],
        a.cpu_time as [cpu],
        a.reads as [reads],
        a.writes as [writes],
        a.logical_reads as [logical reads],
        a.wait_type as [waittype],
        a.wait_time as [waittime],
        a.last_wait_type as [last waittype],
        a.wait_resource as [waitresource],
        m.requested_memory_kb as [requested memory],
        a.granted_query_memory as [granted query memory],
        m.max_used_memory_kb as [max used memory]
from    sys.dm_exec_requests a with (nolock) outer apply sys.dm_exec_sql_text(a.sql_handle) b left join sys.dm_exec_query_memory_grants m (nolock) on m.session_id = a.session_id 
and     m.request_id = a.request_id join sys.databases d on d.database_id = a.database_id
where   a.session_id > 50
and     a.session_id <> @@spid
order by [duration starttime] asc

/*
Dubbele users ..
*/

declare @db    varchar(25)
set @db = '___'

select	getdate()
,		loginame
,		spid
,		login_time
,		last_batch
,		cmd
,		cpu
,		physical_io  
from	master..sysprocesses 
where	loginame in  (select	loginame 
					  from		master..sysprocesses
					  where		dbid = (select	dbid 
										from	master..sysdatabases 
										where	name = @db)
					  and		loginame like '%.%' 
					  group by	loginame  having count(*) > 1
					  )  
--AND cmd <> 'AWAITING COMMAND'  
--ORDER BY loginame, last_batch

/*
SQL_HANDLE
*/

declare @spid varchar(25)
set		@spid = '___'

select [text] from ::fn_get_sql((select sql_handle 
								from master..sysprocesses 
								where spid = @spid
								));
GO

/*
Show dubbele queries  
*/

select	sql_handle
,       count(*) as count
from	master..sysprocesses inner join  sys.dm_os_waiting_tasks on master..sysprocesses.spid = sys.dm_os_waiting_tasks.session_id 
where	loginame not in ('sa') and wait_type = 'pageiolatch_sh' --and cmd <> 'awaiting command'
group	by sql_handle
order by count desc

/*
PLAN_HANDLE (show sqlplan for a session_id)
*/

declare @id    varchar(25)
set @id = '___'

select query_plan, * 
from   sys.dm_exec_cached_plans cp cross apply sys.dm_exec_query_plan(cp.plan_handle) 
where  plan_handle = (select plan_handle 
					  from   sys.dm_exec_requests 
					  where session_id = @id
					  );