我正在配置一个作业,以获取违规进程的SPID并将其终止。我在使用@AdamMachanic中伟大的sp_Whoiscative与登录名上的sysprocesses以及SPID和session_id值之间的混合,因为它们应该是相同的(或者我错了,这就是我的错误吗?)
我得到了一些我不明白的东西:对于来自sysprocesses的同一个SPID,我从所有的活动结果中得到不同的session_id值。这里有什么不对的?
这是我正在使用的代码。在当前日期时间之前获取值10s的筛选器是因为whoisactive正使用参数@deltainterval运行,该参数在每次运行时执行大约需要10s。
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());
发布于 2016-07-26 23:56:41
=== session_id.
您所看到的是笛卡儿产品,因为您正在加入一个在数据集中并不是唯一的字段。你目前有:
FROM sys.sysprocesses sp JOIN Log_WhoIsActive_tests dt
ON sp.loginame = dt.login_name
您至少应该在该联接中添加以下条件:
AND sp.spid = dt.session_id
另外,请不要使用sysprocesses
。在Server 2005发布时,不推荐使用它,您使用的sys.sysprocesses
“表”只是一个兼容性视图。sys.sysprocesses的MSDN页面顶部甚至有一条注释,声明:
此Server 2000系统表是作为向后兼容性视图而包含的。建议您改用当前的Server系统视图。若要查找等效的系统视图,请参阅将系统表映射到系统视图(Transact-SQL)。此功能将在Microsoft Server的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
您应该使用新的DMV (动态管理视图):
请注意,登录可能需要获得VIEW SERVER STATE
的服务器级权限,以便查看比他们自己的sys.dm_exec_sessions
和sys.dm_exec_requests
数据更多的内容,或者在sys.dm_exec_connections
中看到任何内容。
如果需要此权限,则运行GRANT
语句时的当前数据库需要为master
,因为这是服务器级权限。
https://dba.stackexchange.com/questions/145032
复制相似问题