【问题标题】:SQL script to kill all blocked processes?SQL脚本杀死所有阻塞的进程?
【发布时间】:2013-06-30 18:09:48
【问题描述】:

我正在尝试创建一个 SQL 脚本来杀死所有被阻止的进程。

我错过了什么吗?

declare @max_count int, @count int, @sqlstring varchar(100)
declare @spid_table table (spid int NOT NULL)

INSERT @spid_table
select spid
from master.dbo.sysprocesses
where spid in (select blocked from master.dbo.sysprocesses where blocked > 0) 

select @max_count = MAX(spid) FROM @spid_table
select top 1 @count = spid from @spid_table

while @count <= @max_count
begin
select @sqlstring = 'kill ' + CONVERT(varchar(4), @count)
exec(@sqlstring)
end

【问题讨论】:

  • 一个小错误-WHERE spid IN (SELECT spid /*blocked*/ ....)
  • 杀掉被屏蔽的?好吧,射击无辜者,而不是调查欺负者(拦截者)......
  • @RemusRusanu 那么你如何惩罚这个恶霸?有没有更好的方法来找到罪魁祸首?而不是在哪里被阻止 >0?
  • 是的,blocked 是拦截器的 SPID。递归地应用,直到找到链的顶部,即阻塞而没有被阻塞的那个。调查那个在做什么。使用像sp_whoisactive 这样的工具。

标签: sql sql-server kill kill-process


【解决方案1】:

试试这个 -

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = STUFF((
    SELECT CHAR(13) + 'KILL ' + CAST(spid as VARCHAR(5))
    FROM master.dbo.sysprocesses
    WHERE blocked != 0
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

PRINT @SQL

EXEC sys.sp_executesql @SQL

【讨论】:

    【解决方案2】:

    您错过了通过@spid_table 递增的方法。您应该在 while 之后的 exec 之后添加两行

    DELETE FROM @spid_table WHERE spid = @count
    SELECT @count = spid FROM @spid_table
    

    或将 IDENTITY 列添加到 @spid_table 并将其用于循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多