原生 KILL spid 單次只能結束一個會話,批量清理極其繁瑣。
部署於 master 資料庫,支援四種模式:
EXEC kill2 '58';
EXEC kill2 '51-57'; -- 結束 51 到 57 所有存在的 SPID
EXEC kill2 '51,56,100,58';
EXEC kill2 'DB=MyDatabase';
CREATE PROCEDURE kill2 @param VARCHAR(500)
AS
BEGIN
SET @param = REPLACE(@param, ' ', '');
-- 範圍模式: 含 '-'
IF CHARINDEX('-', @param) > 0
-- 解析起止,循環 KILL 存在且 > 50 的 SPID (排除系統進程)
-- 列表模式: 含 ','
IF CHARINDEX(',', @param) > 0
-- 分割循環 KILL
-- 資料庫模式: 含 '='
IF CHARINDEX('=', @param) > 0
-- 解析 DB 名,游標遍歷 sysprocesses 該 DB 的 SPID 並 KILL
-- 單一 SPID
IF ... -- 無上述符號
-- 直接 KILL
END
USE master;
GO
-- 執行上述 CREATE PROCEDURE 腳本
-- 測試
EXEC kill2 '51-55';
EXEC kill2 'DB=TestDB';
spid > 50 過濾,保護系統進程 (1-50 通常為系統)-- 結束資料庫所有連接 (單條語句)
ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [MyDatabase] SET MULTI_USER;
此法更簡潔,但會強制斷開**所有**連接(含正在執行的查詢),使用前務必評估影響。
kill2 適合精細控制(特定 SPID/範圍/列表);SET SINGLE_USER 適合「必須獨佔資料庫」場景(還原/結構變更/離線維護)。**按需選擇,謹慎執行。**