從本質上講,你可以創建一個單獨的進程來觀看特定的任務和指標的背景和殺死如果必要。讓我們開始在你想跟蹤的代碼中植入一個跟蹤設備。我用了一個關鍵短語「殺死我」的評論塊。你可以把類似的東西在你原來的代碼
CREATE PROCEDURE TrackedToKill
-- EXEC TrackedToKill
/* Comment Block tracking device: Kill Me*/
AS
BEGIN
DECLARE @Counter bigint = 0
WHILE 1 = 1
BEGIN
SET @Counter = @Counter + 1
WAITFOR DELAY '00:00:30'
END
END
然後讓我們看看我們是否能夠找到運行的會話
SELECT session_id,
command,database_id,user_id,
wait_type,wait_resource,wait_time,
percent_complete,estimated_completion_time,
total_elapsed_time,reads,writes,text
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text (sys.dm_exec_requests.sql_handle)
WHERE text LIKE '%Kill Me%'
AND session_id <> @@SPID
OK大,這應該返回與您的跟蹤設備的會話。然後,我們可以將其轉換爲另一個存儲過程,該過程將根據跟蹤設備和您可能需要的任何其他標準來終止您的流程。您可以手動啓動,也可以在啓動時使用SQL代理啓動。包含儘可能多的附加條件,以確保限制你所殺的範圍(即:用戶,數據庫,數據塊,或尚未回滾的進程)。
CREATE PROCEDURE HunterKiller
-- EXEC HunterKiller
AS
BEGIN
DECLARE @SessionToKill int
DECLARE @SQL nvarchar(3000)
WHILE 1=1
BEGIN
SET @SessionToKill = (SELECT TOP 1 session_id
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text (sys.dm_exec_requests.sql_handle)
WHERE session_id <> @@SPID
AND text LIKE '%Kill Me%'
AND total_elapsed_time >= 15000)
SET @SQL = 'KILL ' + CONVERT(nvarchar,@SessionToKill)
EXEC (@SQL)
WAITFOR DELAY '00:00:05'
END
END
這可能有所幫助:http://stackoverflow.com/a/1354333/673707 – Helio
@Helio謝謝。我需要在tsql過程中執行此操作 - 是您發送給我的鏈接中的語法嗎? (我沒有看到它) – whytheq
https://msdn.microsoft.com/en-us/library/ms189040.aspx – Helio