declare @MaxAttemptsToKillEachUserProcess int
declare @CurrentAttempts int
declare @ServerName varchar(128)
declare @DatabaseName varchar(128)
declare @SQLCommand varchar(128)
declare @spid int
declare @LoginName varchar(128)
set nocount on
set @MaxAttemptsToKillEachUserProcess = 3
-- 得到服务器和数据库名称
set @ServerName = cast(isnull(serverproperty('ServerName'), 'Unknown') as sysname)
-- 该表记录用户进程标识
if object_id('tempdb..#tempProcesses', 'U') is not null
begin
drop table #tempProcesses
end
create table #tempProcesses (
spid int,
ecid int,
status varchar(256),
LoginName varchar(128),
HostName varchar(128),
BlockedBy varchar(128),
DatabaseName varchar(128),
command varchar(256)
)
insert into #tempProcesses
exec sp_who
delete #tempProcesses where spid <= 50 or spid=@@spid
declare cur1 cursor for select spid,LoginName,DatabaseName from #tempProcesses
open cur1
fetch cur1 into @spid,@LoginName,@DatabaseName
while @@fetch_status=0
begin
select @SQLCommand ='kill ' + cast(@spid as varchar(32))
set @CurrentAttempts = 0
while @CurrentAttempts <= @MaxAttemptsToKillEachUserProcess
begin
exec(@SQLCommand)
if @@error<>0
begin
select 'Error killing process ' + cast(@spid as varchar(32)) +', of login ' + @LoginName
+ ', on database ' + @DatabaseName+ '。 这个进程可能已被用户中止。'
break
end
-- 确认进程真正终止
exec sp_who @spid
if @@rowcount=0
break
else
set @CurrentAttempts = @CurrentAttempts + 1
end
fetch cur1 into @spid,@LoginName,@DatabaseName
end
close cur1
deallocate cur1
drop table #tempProcesses
go