2013-07-03 99 views
2

我試圖創建一個SQL腳本,將殺死所有被阻止的進程。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 
+0

有一個小錯誤 - WHERE spid IN(SELECT spid/* blocked */....)' – Devart

+0

殺死被阻止的?那麼確定,拍攝無辜者,而不是調查在欺負(攔截器)... –

+0

@RemusRusanu所以你如何罰款欺負?有沒有更好的方法找到罪魁禍首?而不是阻止> 0的地方? – anonymous1110

回答

1

你缺少一個方式,通過你的@spid_table遞增。您應該exec

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

後添加兩行您while內或添加IDENTITY列@spid_table並將其用於循環。

5

嘗試這一個 -

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