Skip to content

Commit 8370607

Browse files
BrentOzarclaude
andcommitted
sp_kill: change filter params to NULL defaults for kill-everything support
Change @LeadBlockers, @readonly, @SPIDState, @OmitLogin, and @HasOpenTran from string defaults ('N'/'') to NULL. This makes filter detection consistent: NULL = not specified, value = active. EXEC sp_kill @ExecuteKills = 'Y' now cleanly kills all user sessions (except system, rollbacks, and the caller's own SPID) with no filters needed. Display mode with no filters still just shows sessions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent fab85e7 commit 8370607

1 file changed

Lines changed: 39 additions & 35 deletions

File tree

sp_kill.sql

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ ALTER PROCEDURE dbo.sp_kill
99
@AppName NVARCHAR(256) = NULL,
1010
@DatabaseName NVARCHAR(256) = NULL,
1111
@HostName NVARCHAR(256) = NULL,
12-
@LeadBlockers VARCHAR(1) = 'N',
13-
@ReadOnly VARCHAR(1) = 'N',
12+
@LeadBlockers VARCHAR(1) = NULL,
13+
@ReadOnly VARCHAR(1) = NULL,
1414
@OrderBy VARCHAR(20) = 'duration',
15-
@SPIDState VARCHAR(1) = '',
16-
@OmitLogin NVARCHAR(256) = '',
17-
@HasOpenTran VARCHAR(1) = '',
15+
@SPIDState VARCHAR(1) = NULL,
16+
@OmitLogin NVARCHAR(256) = NULL,
17+
@HasOpenTran VARCHAR(1) = NULL,
1818
@RequestsOlderThanMinutes INT = NULL,
1919
@OutputDatabaseName NVARCHAR(256) = NULL,
2020
@OutputSchemaName NVARCHAR(256) = NULL,
@@ -109,22 +109,22 @@ Parameters:
109109
@HostName NVARCHAR(256) = NULL
110110
Kill sessions from this host.
111111
112-
@LeadBlockers VARCHAR(1) = ''N''
112+
@LeadBlockers VARCHAR(1) = NULL
113113
Y = kill only lead blockers (sessions blocking others but not blocked themselves).
114114
115-
@ReadOnly VARCHAR(1) = ''N''
115+
@ReadOnly VARCHAR(1) = NULL
116116
Y = only kill read-only queries (SELECT with no writes).
117117
118118
@OrderBy VARCHAR(20) = ''duration''
119119
Sort order for kill recommendations: duration, cpu, reads, writes, tempdb, transactions.
120120
121-
@SPIDState VARCHAR(1) = ''''
122-
S = only sleeping sessions, R = only running sessions, empty = both.
121+
@SPIDState VARCHAR(1) = NULL
122+
S = only sleeping sessions, R = only running sessions.
123123
124-
@OmitLogin NVARCHAR(256) = ''''
124+
@OmitLogin NVARCHAR(256) = NULL
125125
Exclude sessions belonging to this login from kill recommendations.
126126
127-
@HasOpenTran VARCHAR(1) = ''''
127+
@HasOpenTran VARCHAR(1) = NULL
128128
Y = only target sessions with open transactions.
129129
130130
@RequestsOlderThanMinutes INT = NULL
@@ -143,6 +143,9 @@ Example usage:
143143
-- Just show recommendations, no killing:
144144
EXEC sp_kill;
145145
146+
-- Kill everything (except system sessions, rollbacks, and your own session):
147+
EXEC sp_kill @ExecuteKills = ''Y'';
148+
146149
-- Kill all lead blockers:
147150
EXEC sp_kill @LeadBlockers = ''Y'', @ExecuteKills = ''Y'';
148151
@@ -205,12 +208,12 @@ For more info, visit http://FirstResponderKit.org
205208
IF @AppName IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @AppName = N''' + REPLACE(@AppName, N'''', N'''''') + N'''';
206209
IF @DatabaseName IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @DatabaseName = N''' + REPLACE(@DatabaseName, N'''', N'''''') + N'''';
207210
IF @HostName IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @HostName = N''' + REPLACE(@HostName, N'''', N'''''') + N'''';
208-
IF @LeadBlockers <> 'N' SET @ParametersUsed = @ParametersUsed + N', @LeadBlockers = ''' + REPLACE(@LeadBlockers, N'''', N'''''') + N'''';
209-
IF @ReadOnly <> 'N' SET @ParametersUsed = @ParametersUsed + N', @ReadOnly = ''' + REPLACE(@ReadOnly, N'''', N'''''') + N'''';
211+
IF @LeadBlockers IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @LeadBlockers = ''' + REPLACE(@LeadBlockers, N'''', N'''''') + N'''';
212+
IF @ReadOnly IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @ReadOnly = ''' + REPLACE(@ReadOnly, N'''', N'''''') + N'''';
210213
IF @OrderBy <> 'duration' SET @ParametersUsed = @ParametersUsed + N', @OrderBy = N''' + REPLACE(@OrderBy, N'''', N'''''') + N'''';
211-
IF @SPIDState <> '' SET @ParametersUsed = @ParametersUsed + N', @SPIDState = ''' + REPLACE(@SPIDState, N'''', N'''''') + N'''';
212-
IF @OmitLogin <> '' SET @ParametersUsed = @ParametersUsed + N', @OmitLogin = N''' + REPLACE(@OmitLogin, N'''', N'''''') + N'''';
213-
IF @HasOpenTran <> '' SET @ParametersUsed = @ParametersUsed + N', @HasOpenTran = ''' + REPLACE(@HasOpenTran, N'''', N'''''') + N'''';
214+
IF @SPIDState IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @SPIDState = ''' + REPLACE(@SPIDState, N'''', N'''''') + N'''';
215+
IF @OmitLogin IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @OmitLogin = N''' + REPLACE(@OmitLogin, N'''', N'''''') + N'''';
216+
IF @HasOpenTran IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @HasOpenTran = ''' + REPLACE(@HasOpenTran, N'''', N'''''') + N'''';
214217
IF @RequestsOlderThanMinutes IS NOT NULL SET @ParametersUsed = @ParametersUsed + N', @RequestsOlderThanMinutes = ' + CAST(@RequestsOlderThanMinutes AS NVARCHAR(10));
215218

216219
/*-------------------------------------------------------
@@ -222,27 +225,27 @@ For more info, visit http://FirstResponderKit.org
222225
RETURN;
223226
END;
224227

225-
IF @LeadBlockers NOT IN ('Y', 'N')
228+
IF @LeadBlockers IS NOT NULL AND @LeadBlockers <> 'Y'
226229
BEGIN
227-
RAISERROR('@LeadBlockers must be Y or N.', 11, 1) WITH NOWAIT;
230+
RAISERROR('@LeadBlockers must be Y or NULL.', 11, 1) WITH NOWAIT;
228231
RETURN;
229232
END;
230233

231-
IF @ReadOnly NOT IN ('Y', 'N')
234+
IF @ReadOnly IS NOT NULL AND @ReadOnly <> 'Y'
232235
BEGIN
233-
RAISERROR('@ReadOnly must be Y or N.', 11, 1) WITH NOWAIT;
236+
RAISERROR('@ReadOnly must be Y or NULL.', 11, 1) WITH NOWAIT;
234237
RETURN;
235238
END;
236239

237-
IF @SPIDState NOT IN ('S', 'R', '')
240+
IF @SPIDState IS NOT NULL AND @SPIDState NOT IN ('S', 'R')
238241
BEGIN
239-
RAISERROR('@SPIDState must be S (sleeping), R (running), or empty string (both).', 11, 1) WITH NOWAIT;
242+
RAISERROR('@SPIDState must be S (sleeping), R (running), or NULL (both).', 11, 1) WITH NOWAIT;
240243
RETURN;
241244
END;
242245

243-
IF @HasOpenTran NOT IN ('Y', '')
246+
IF @HasOpenTran IS NOT NULL AND @HasOpenTran <> 'Y'
244247
BEGIN
245-
RAISERROR('@HasOpenTran must be Y or empty string.', 11, 1) WITH NOWAIT;
248+
RAISERROR('@HasOpenTran must be Y or NULL.', 11, 1) WITH NOWAIT;
246249
RETURN;
247250
END;
248251

@@ -491,7 +494,8 @@ For more info, visit http://FirstResponderKit.org
491494
END
492495
/* 7c: Otherwise, apply all filters as AND conditions in a single pass.
493496
A session must match ALL specified filters to be recommended for kill.
494-
If @ExecuteKills = 'N' and no filters are set, don't recommend anything. */
497+
With no filters, @ExecuteKills = 'Y' kills everything;
498+
@ExecuteKills = 'N' just shows sessions without recommending. */
495499
ELSE
496500
BEGIN
497501
/* When in display mode with no filters, just show sessions without recommending kills */
@@ -500,12 +504,12 @@ For more info, visit http://FirstResponderKit.org
500504
AND @AppName IS NULL
501505
AND @DatabaseName IS NULL
502506
AND @HostName IS NULL
503-
AND @LeadBlockers = 'N'
504-
AND @ReadOnly = 'N'
505-
AND @SPIDState = ''
506-
AND @HasOpenTran = ''
507+
AND @LeadBlockers IS NULL
508+
AND @ReadOnly IS NULL
509+
AND @SPIDState IS NULL
510+
AND @HasOpenTran IS NULL
507511
AND @RequestsOlderThanMinutes IS NULL
508-
AND @OmitLogin = ''
512+
AND @OmitLogin IS NULL
509513
BEGIN
510514
/* No filters in display mode - nothing to recommend */
511515
IF @Debug = 1
@@ -522,12 +526,12 @@ For more info, visit http://FirstResponderKit.org
522526
AND (@AppName IS NULL OR program_name LIKE @AppName)
523527
AND (@DatabaseName IS NULL OR database_name = @DatabaseName)
524528
AND (@HostName IS NULL OR host_name = @HostName)
525-
AND (@ReadOnly = 'N' OR is_read_only = 1)
526-
AND (@SPIDState = '' OR (@SPIDState = 'S' AND [status] = 'sleeping') OR (@SPIDState = 'R' AND [status] = 'running'))
527-
AND (@HasOpenTran = '' OR ISNULL(open_transaction_count, 0) > 0)
529+
AND (@ReadOnly IS NULL OR is_read_only = 1)
530+
AND (@SPIDState IS NULL OR (@SPIDState = 'S' AND [status] = 'sleeping') OR (@SPIDState = 'R' AND [status] = 'running'))
531+
AND (@HasOpenTran IS NULL OR ISNULL(open_transaction_count, 0) > 0)
528532
AND (@RequestsOlderThanMinutes IS NULL OR last_request_start_time <= DATEADD(MINUTE, -@RequestsOlderThanMinutes, GETDATE()))
529-
AND (@OmitLogin = '' OR login_name <> @OmitLogin)
530-
AND (@LeadBlockers = 'N' OR (
533+
AND (@OmitLogin IS NULL OR login_name <> @OmitLogin)
534+
AND (@LeadBlockers IS NULL OR (
531535
EXISTS (SELECT 1 FROM #hitlist blocked WHERE blocked.blocking_session_id = h.session_id)
532536
AND (h.blocking_session_id IS NULL OR h.blocking_session_id = 0)
533537
));

0 commit comments

Comments
 (0)