我正在配置一项工作以获取违规进程的SPID并将其杀死。我正在使用来自@AdamMachanic 的出色sp_Whoiscative和加入登录名和 SPID 和session_id值的sysprocesses之间的混合,因为它们应该是相同的(或者我错了,那是我的错误?)。
我得到了一些我不明白的东西:对于来自 sysprocesses 的相同SPID,我从 whoisactive 结果中得到不同的 session_id值。这里有什么不正确的?
这是我正在使用的代码。在当前日期时间之前 10 秒获取值的过滤器是因为 whoisactive 正在使用参数 @deltainterval 运行,每次运行大约需要 10 秒才能执行。
USE master;
-- Log information about current running processes to table Log_WhoIsActive
EXEC [master].[dbo].[sp_WhoIsActive]
@get_full_inner_text = 1,
@get_plans = 2,
@get_outer_command = 1,
@get_transaction_info = 1,
@get_task_info = 2,
@get_locks = 1,
@get_avg_time = 1,
@get_additional_info = 1,
@delta_interval = 2,
@sort_order = '[start_time] DESC',
@destination_table = 'Log_WhoIsActive_tests';
--compare date from sysprocesses with data gathered on sp_whosiactive
SELECT dt.collection_time, sp.spid, dt.[dd hh:mm:ss.mss], sp.loginame,
dt.login_name, dt.session_id
FROM sys.sysprocesses sp JOIN Log_WhoIsActive_tests dt
ON sp.loginame = dt.login_name
WHERE sp.loginame = 'my_login_name'
AND sp.status = 'runnable'
AND sp.spid > 50
AND dt.collection_time > DATEADD(ss, -10, GETDATE());
SPID === session_id。
您看到的是笛卡尔积,因为您加入的字段在数据集中不是唯一的。您目前拥有:
您至少应该在该 JOIN 中添加以下条件:
另外,请不要使用
sysprocesses
. SQL Server 2005 发布时已弃用,sys.sysprocesses
您使用的“表”只是一个兼容性视图。sys.sysprocesses的 MSDN 页面甚至在顶部有一条说明:您应该改用新的 DMV(动态管理视图):
请注意,登录可能需要被授予 的服务器级权限,
VIEW SERVER STATE
以便查看更多的和 的数据sys.dm_exec_sessions
,sys.dm_exec_requests
或查看 中的任何内容sys.dm_exec_connections
。如果需要这个权限,那么运行
GRANT
语句时的当前数据库就需要,master
因为这是一个服务器级别的权限。