Yar*_*lav 3 sql-server t-sql sql-server-2014
我正在配置一个作业以获取违规进程的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());
Run Code Online (Sandbox Code Playgroud)
SPID === session_id。
您看到的是笛卡尔积,因为您加入的字段在数据集中不是唯一的。您目前拥有:
FROM sys.sysprocesses sp JOIN Log_WhoIsActive_tests dt
ON sp.loginame = dt.login_name
Run Code Online (Sandbox Code Playgroud)
您可能至少应该向该 JOIN 添加以下条件:
AND sp.spid = dt.session_id
Run Code Online (Sandbox Code Playgroud)
另外,请不要使用sysprocesses. 它在 SQL Server 2005 发布时已被弃用,sys.sysprocesses您使用的“表”只是一个兼容性视图。sys.sysprocesses的 MSDN 页面甚至在顶部有一条说明:
此 SQL Server 2000 系统表作为向后兼容性视图包含在内。我们建议您改用当前的 SQL Server 系统视图。要查找等效的系统视图或视图,请参阅将系统表映射到系统视图 (Transact-SQL)。此功能将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。
您应该改用新的 DMV(动态管理视图):
请注意,登录可能需要被授权的服务器级别的权限VIEW SERVER STATE,以多看少为自己的数据sys.dm_exec_sessions和sys.dm_exec_requests,或者看到在所有的东西sys.dm_exec_connections。
如果需要这个权限,那么运行该GRANT语句时的当前数据库需要master是服务器级别的权限。
| 归档时间: |
|
| 查看次数: |
8473 次 |
| 最近记录: |