It uses sysprocesses to find and kill any open processes for the supplied database name or all if you pass '/all'
ALTER PROCEDURE [Utils].[usp_KillAllProcesses] @database varchar(100) AS SET NOCOUNT ON -- Check validity of supplied database name IF db_id(@database) > 4 OR LOWER(LTRIM(RTRIM(@database))) = '/all' BEGIN -- variable declaration and initial values DECLARE @chv_killprocessestring varchar(8000) DECLARE @ins_initialprocesses smallint DECLARE @ins_remainingprocesses smallint SET @ins_initialprocesses = 0 SET @ins_remainingprocesses = 0 SET @chv_killprocessestring = '' -- Fetch number of processes to kill -- Fetch number of processes to kill IF LOWER(LTRIM(RTRIM(@database))) = '/all' BEGIN SELECT @ins_initialprocesses = COUNT(*) FROM master..sysprocesses WHERE status <> 'background' -- to get the user process AND status in ('runnable','sleeping') -- to avoid the current spid AND spid <> @@spid -- avoid system processes AND spid > 50 END ELSE BEGIN SELECT @ins_initialprocesses = COUNT(*) FROM master..sysprocesses WHERE dbid = db_id(@database) -- to avoid the sql process AND status <> 'background' -- to get the user process AND status in ('runnable','sleeping') -- to avoid the current spid AND spid <> @@spid -- avoid system processes AND spid > 50 END -- Check there are processes to kill IF @ins_initialprocesses > 0 BEGIN -- Build command string of processes to kill > IF LOWER(LTRIM(RTRIM(@database))) = '/all' BEGIN SELECT @chv_killprocessestring = coalesce(@chv_killprocessestring,',' ) + 'KILL ' + convert(varchar, spid)+ '; ' FROM master..sysprocesses WHERE status <> 'background' -- to get the user process AND status in ('runnable','sleeping') -- to avoid the current spid AND spid <> @@spid -- avoid system processes AND spid > 50 END ELSE BEGIN SELECT @chv_killprocessestring = coalesce(@chv_killprocessestring,',' ) + 'KILL ' + convert(varchar, spid)+ '; ' FROM master..sysprocesses WHERE dbid = db_id(@database) -- to avoid the sql process AND status <> 'background' -- to get the user process AND status in ('runnable','sleeping') -- to avoid the current spid AND spid <> @@spid -- avoid system processes AND spid > 50 END -- Kill processes (run command created above) > EXEC (@chv_killprocessestring) -- Fetch number of processes remaining > IF LOWER(LTRIM(RTRIM(@database))) = '/all' BEGIN SELECT @ins_remainingprocesses = COUNT(*) FROM master..sysprocesses WHERE status <> 'background' -- to get the user process AND status in ('runnable','sleeping') -- to avoid the current spid AND spid <> @@spid -- avoid system processes AND spid > 50 END ELSE BEGIN SELECT @ins_remainingprocesses = COUNT(*) FROM master..sysprocesses WHERE dbid = db_id(@database) -- to avoid the sql process AND status <> 'background' -- to get the user process AND status in ('runnable','sleeping') -- to avoid the current spid AND spid <> @@spid -- avoid system processes AND spid > 50 END IF @ins_remainingprocesses = 0 BEGIN -- Report on processes killed if killed them all > PRINT LTRIM(RTRIM(UPPER(@database))) + ' - Killed ' + RTRIM(CONVERT(VARCHAR(10), @ins_initialprocesses)) + ' connection(s)' END IF @ins_remainingprocesses <> 0 BEGIN -- Report on processes remaining if could not end them all > PRINT LTRIM(RTRIM(UPPER(@database))) + ' - Killed ' + RTRIM(CONVERT(VARCHAR(10), @ins_initialprocesses-@ins_remainingprocesses)) + ' connection(s), '+ RTRIM(CONVERT(VARCHAR(10), @ins_remainingprocesses)) + ' processes remaining.' END END IF @ins_initialprocesses = 0 BEGIN -- Report there are no processes for that DB > PRINT @database + ' - No processes to kill' END END ELSE BEGIN -- Supplied database name not valid or was a system db, hence report that > PRINT 'Invalid Database name or System Database supplied' END GO
No comments:
Post a Comment