You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server终止阻塞会话及跨链接服务器执行Kill命令实现方案

实现跨链接服务器终止远程SQL Server会话的方案

核心逻辑:KILL命令无法直接跨链接服务器执行,需通过链接服务器调用目标实例的动态SQL执行接口完成远程命令下发。

前置条件

  • 管控端到目标SQL Server的链接服务器(示例中命名为[Target_Linked_Server])已配置正常联通
  • 链接服务器使用的认证账号,在目标SQL Server实例上拥有ALTER ANY CONNECTION权限(执行KILL命令的必备权限)

改造后可直接使用的脚本

DECLARE @TargetLinkedServer NVARCHAR(128) = N'[Target_Linked_Server]' -- 替换为你的链接服务器名称
DECLARE @tbl TABLE (sesid INT)
DECLARE @n INT, @i INT = 0, @s INT, @killCommand NVARCHAR(20) = N'KILL ', @sql NVARCHAR(255), @RemoteExecSql NVARCHAR(500)

-- 从远程链接服务器查询阻塞会话ID
INSERT INTO @tbl(sesid)
EXEC('
SELECT DISTINCT BlkBy 
FROM (
    SELECT  
        spid,
        blocked BlkBy,
        sd.name DBName
    FROM master.dbo.sysprocesses sp 
    JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid 
) AS tbl
WHERE BlkBy <> 0
') AT @TargetLinkedServer

SELECT @n = COUNT(*) FROM @tbl

WHILE @i < @n
BEGIN 
    SELECT TOP 1 @s = sesid FROM @tbl
    -- 构造远程执行的KILL命令
    SET @sql = @killCommand + CAST(@s AS NVARCHAR(10))
    SET @RemoteExecSql = N'EXEC sp_executesql N''' + REPLACE(@sql, '''', '''''') + N''''
    -- 调用远程链接服务器执行命令
    EXEC (@RemoteExecSql) AT @TargetLinkedServer
    
    DELETE FROM @tbl WHERE sesid = @s
    SET @i = @i + 1
END

注意事项

  • 如果目标实例为SQL Server 2005及以上版本,建议将原查询中的sysprocesses替换为更稳定的sys.dm_exec_sessions、sys.dm_tran_locks动态管理视图,查询阻塞会话的准确率更高
  • 建议在脚本中增加会话过滤逻辑,避免误杀系统会话、运维操作会话
  • 如需管控多台实例,只需遍历你的实例配置表,循环替换@TargetLinkedServer变量的值即可批量执行

内容的提问来源于stack exchange,提问作者mothana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:06:03