sqlserver 删除造成锁表的sleeping进程脚本

create  PROCEDURE dbo.Kill__Sleeping_Processes
AS
BEGIN
declare @v_sid int
declare @sql varchar(50)
declare cur_kill_sleep cursor for 
WITH sess AS
(
    SELECT
        blocking_session_id,        
        es.session_id,
        er.status,
        individual_query = SUBSTRING (qt.text, (er.statement_start_offset/2)+1,  ((CASE WHEN er.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text))  * 2 ELSE er.statement_end_offset END - er.statement_start_offset)/2)+1)
    FROM
        sys.dm_exec_requests er
        INNER JOIN sys.dm_exec_sessions es ON er.session_id = es.session_id
        CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
    WHERE
        es.session_id > 50
        AND es.session_Id NOT IN (@@SPID)
              AND qt.text <> 'sp_server_diagnostics'
)
SELECT
    session_id
FROM
    sess WHERE individual_query NOT LIKE 'waitfor%' and status='sleeping'
UNION ALL 
  select  es.session_id
FROM
    sys.dm_exec_sessions es
    INNER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
    CROSS APPLY sys.dm_exec_sql_text(ec.most_recent_sql_handle)as qt
WHERE  status='sleeping'  and
    ec.most_recent_session_id IN
    (
        SELECT blocking_session_id FROM sess WHERE blocking_session_id NOT  IN(SELECT DISTINCT session_id FROM sess)
    ) AND  qt.text NOT in ('waitfor delay @waittime    ','sp_server_diagnostics')  

open cur_kill_sleep
fetch next from cur_kill_sleep into @v_sid
while @@fetch_status=0
begin
SET @sql = 'KILL ' + RTRIM(@v_sid)
EXEC ( @sql )
print '删除'+CONVERT(varchar(10),@v_sid)
fetch next from cur_kill_sleep into @v_sid
end
close cur_kill_sleep
deallocate cur_kill_sleep
END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值