如何在SQL Server 2012中自动终止或终止挂起的任务?

时间:2015-07-22 03:40:42

标签: sql-server sql-server-2012

我们如何在SQL Server 2012中自动终止或终止挂起的任务?当我运行sp_who2时,它会显示Suspended状态下的许多进程。

我想知道有没有办法可以自动终止或终止暂停的进程/任务而不是手动执行。

我知道如何手动杀死SPID,但我想要一些可以在规定的时间后自动杀死这些任务的东西。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

这是一个简单的代码段,其中显示所有已暂停的SQL任务,并生成脚本将其全部杀死。

DECLARE @sql NVARCHAR(max) = ''

SELECT @sql = @sql + 'kill ' + cast(session_id as nvarchar(30)) + ';' 
-- select *
FROM sys.dm_exec_requests 
WHERE status = 'suspended'
--and database_id = DB_ID('master')
--and user_id = USER_ID('sa')


print @sql
--EXEC(@sql)

要在以下行中按数据库取消注释添加过滤器并更改数据库名称

and database_id = DB_ID('master')

您还可以按运行暂停查询的数据库用户对其进行过滤

and user_id = USER_ID('sa')

要自动执行该生成的脚本,请仅取消最后一行的注释

EXEC(@sql)

应该适用于所有SQL Server版本。在Microsoft SQL Server 2008 R2及更高版本上进行了测试

答案 1 :(得分:1)

要做到这一点,你应该:

  1. 查询特殊DMV以使PSID处于SUSPENDED状态:

    SELECT * FROM sys.dm_exec_requests WHERE status ='suspended'

  2. 使用例如光标在该结果集上逐一杀死它们

  3. 获取该脚本并将其填入数据库作业;安排工作定期运行

  4. 但是,如果您这样做,您应该记住,当他尝试使用的资源被释放/解锁时,暂停的查询可以再次开始运行。如果该查询在例如存储过程在没有事务的情况下修改数据,那么你的kill-automatization可能会因为中断这样的进程而严重搞乱。

答案 2 :(得分:0)

我在这里写了一个样本:

DECLARE @sql NVARCHAR(max) = ''

SELECT @sql = CONCAT(@sql, 'kill ' , session_id, CHAR(13))
FROM sys.dm_exec_requests 
WHERE status = 'suspended'

EXEC(@sql)

答案 3 :(得分:0)

DECLARE @ID AS BIGINT
SET @ID = 0
declare @str as nvarchar(Max)

在此示例中,此代码按时间工作:

     DECLARE Spliter1_Cursor CURSOR FOR 

SELECT SPID
FROM sys.sysprocesses 
WHERE hostname  ='APPSERVER'
AND datediff(second,last_batch,getdate()) > 999
ORDER BY datediff(second,last_batch,getdate()) DESC

     OPEN Spliter1_Cursor FETCH NEXT FROM Spliter1_Cursor

        INTO @ID
        WHILE @@FETCH_STATUS = 0
        BEGIN  

        SET@str = ''

        SET@str = 'kill '+ cast (@id as nvarchar (max))

        EXEC (@str)

        FETCH NEXT FROM Spliter1_Cursor INTO @ID

        END


    CLOSE Spliter1_Cursor
    DEALLOCATE Spliter1_Cursor