在SQL Server Agent中执行SQL终止特定主机超时进程的问题
解决SQL Server进程筛选与终止的问题
原SQL语句的问题点
- 等待时间筛选逻辑错误:使用
wait_time = '120000'是精确匹配等于2分钟的进程,而需求是超过2分钟;同时wait_time是int类型,不应使用字符串值匹配,需用数值比较。 - Kill命令格式错误:重复拼接了
session_id,会生成类似kill 5151的无效命令,正确格式应为kill 51。
修正后的SQL脚本
先正确筛选目标进程并生成有效Kill命令,再通过动态SQL执行:
DECLARE @KillCmd NVARCHAR(MAX) = '' SELECT @KillCmd += 'KILL ' + CAST(session_id AS VARCHAR(20)) + ';' FROM sys.dm_exec_sessions WHERE host_name = 'TS2012' AND wait_time > 120000 -- 筛选等待时间超过2分钟(120000毫秒)的进程 AND session_id <> @@SPID -- 排除当前执行脚本的会话,避免误杀自身 -- 仅当存在需要终止的进程时执行命令 IF @KillCmd <> '' EXEC sp_executesql @KillCmd
SQL Server Agent作业配置注意事项
SQL Server Agent的作业计划默认最小执行间隔为1分钟,若要实现每隔10秒执行一次,可在作业步骤中加入循环逻辑:
WHILE 1=1 BEGIN DECLARE @KillCmd NVARCHAR(MAX) = '' SELECT @KillCmd += 'KILL ' + CAST(session_id AS VARCHAR(20)) + ';' FROM sys.dm_exec_sessions WHERE host_name = 'TS2012' AND wait_time > 120000 AND session_id <> @@SPID IF @KillCmd <> '' EXEC sp_executesql @KillCmd WAITFOR DELAY '00:00:10' -- 等待10秒后再次执行 END
注意:这种循环方式会让作业步骤持续运行,需手动在SQL Server Agent中终止作业才能停止。
内容的提问来源于stack exchange,提问作者Frizosty
相关产品推荐
相关产品推荐

