是否有一种方法列出当前在MS SQL Server上运行的查询(无论是通过企业管理器还是SQL)和/或谁连接?
我想我有一个很长时间运行的查询正在我的一个数据库服务器上执行,我想跟踪它并停止它(或不断启动它的人)。
是否有一种方法列出当前在MS SQL Server上运行的查询(无论是通过企业管理器还是SQL)和/或谁连接?
我想我有一个很长时间运行的查询正在我的一个数据库服务器上执行,我想跟踪它并停止它(或不断启动它的人)。
当前回答
正确的脚本应该是这样的:
select
p.spid, p.status,p.hostname,p.loginame,p.cpu,r.start_time, t.text
from sys.dm_exec_requests as r, sys.sysprocesses p
cross apply sys.dm_exec_sql_text(p.sql_handle) t
where p.status not in ('sleeping', 'background')
and r.session_id=p.spid
其他回答
你可以使用下面的查询来查找正在运行的最后一个请求:
SELECT
der.session_id
,est.TEXT AS QueryText
,der.status
,der.blocking_session_id
,der.cpu_time
,der.total_elapsed_time
FROM sys.dm_exec_requests AS der
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS est
使用下面的脚本,你还可以找到每个数据库的连接数:
SELECT
DB_NAME(DBID) AS DataBaseName
,COUNT(DBID) AS NumberOfConnections
,LogiName
FROM sys.sysprocesses
WHERE DBID > 0
GROUP BY DBID, LogiName
详情请浏览: http://www.dbrnd.com/2015/06/script-to-find-running-process-session-logged-user-in-sql-server/
正确的脚本应该是这样的:
select
p.spid, p.status,p.hostname,p.loginame,p.cpu,r.start_time, t.text
from sys.dm_exec_requests as r, sys.sysprocesses p
cross apply sys.dm_exec_sql_text(p.sql_handle) t
where p.status not in ('sleeping', 'background')
and r.session_id=p.spid
SELECT
p.spid, p.status, p.hostname, p.loginame, p.cpu, r.start_time, t.text
FROM
sys.dm_exec_requests as r,
master.dbo.sysprocesses as p
CROSS APPLY sys.dm_exec_sql_text(p.sql_handle) t
WHERE
p.status NOT IN ('sleeping', 'background')
AND r.session_id = p.spid
And
KILL @spid
这将显示在SQL 2000或SQL 2005服务器上运行时间最长的spid:
select
P.spid
, right(convert(varchar,
dateadd(ms, datediff(ms, P.last_batch, getdate()), '1900-01-01'),
121), 12) as 'batch_duration'
, P.program_name
, P.hostname
, P.loginame
from master.dbo.sysprocesses P
where P.spid > 50
and P.status not in ('background', 'sleeping')
and P.cmd not in ('AWAITING COMMAND'
,'MIRROR HANDLER'
,'LAZY WRITER'
,'CHECKPOINT SLEEP'
,'RA MANAGER')
order by batch_duration desc
如果你需要从结果中看到一个给定spid的SQL运行,可以使用这样的方法:
declare
@spid int
, @stmt_start int
, @stmt_end int
, @sql_handle binary(20)
set @spid = XXX -- Fill this in
select top 1
@sql_handle = sql_handle
, @stmt_start = case stmt_start when 0 then 0 else stmt_start / 2 end
, @stmt_end = case stmt_end when -1 then -1 else stmt_end / 2 end
from sys.sysprocesses
where spid = @spid
order by ecid
SELECT
SUBSTRING( text,
COALESCE(NULLIF(@stmt_start, 0), 1),
CASE @stmt_end
WHEN -1
THEN DATALENGTH(text)
ELSE
(@stmt_end - @stmt_start)
END
)
FROM ::fn_get_sql(@sql_handle)
注意,SQL Server 2008的SQL Server活动监控器可以通过右键单击当前服务器并在上下文菜单中转到“活动监控器”来找到。我发现如果使用SQL Server Management Studio,这是杀死进程最简单的方法。