2012-06-11 71 views
6

上所有正在運行的進程的主數據庫執行這個查詢,它給我的所有數據庫中所有正在運行的進程後, 有任何疑問這將殺死一個數據庫上運行的所有進程。如何殺死/終止SQL Server 2008中

USE 
Master 
GO 

SELECT 
SPID,DBID FROM SYSPROCESSES 
WHERE 
DBID NOT IN (1,2,3,4) AND SPID >50 AND SPID<> @@spid 
+1

「這將殺死所有進程上運行數據庫」的所有進程 - 現在爲什麼地球上會有人想這樣做! –

+0

@mitch:我們正在測試我們的虛擬數據庫,所以不用擔心 – Buzz

+1

爲了什麼目的?如果你想要例如轉到單用戶模式,有辦法強制其他人斷開連接(['ROLLBACK IMMEDIATE'](http://msdn.microsoft.com/zh-cn/library/bb522682.aspx)) –

回答

16

如果要強制所有其他的連接斷開,並且您有合適的權限,您可以進出的single user mode反彈數據庫:

alter database current set single_user with rollback immediate; 
go 
alter database current set multi_user; 
go 

到任何其他連接同一個數據庫將被終止。

+0

「ALTER DATABASE電流...」只從SQL Server 2012的支持和轉發 – Sharken

+0

@Sharken - 是的,'current'僅支持在2012年。對於早期版本,您必須命名數據庫。 –

+0

你剛剛救了我的命! – Bobby

1

您可以在上述查詢結果中使用KILL語句與遊標組合。

Kill (Transact-SQL)

+3

是啊,你可以....但你是瘋了.... –

1

請參見下面的SQL腳本來殺死一個給定的數據庫(SQL Server 2014)

Declare @DbName nvarchar(60)='YourDBName' 
Declare @SPID int 

--get all processes 
DECLARE @Table TABLE( 
    SPID INT, 
    Status VARCHAR(MAX), 
    LOGIN VARCHAR(MAX), 
    HostName VARCHAR(MAX), 
    BlkBy VARCHAR(MAX), 
    DBName VARCHAR(MAX), 
    Command VARCHAR(MAX), 
    CPUTime INT, 
    DiskIO INT, 
    LastBatch VARCHAR(MAX), 
    ProgramName VARCHAR(MAX), 
    SPID_1 INT, 
    REQUESTID INT 
) 

INSERT INTO @Table EXEC sp_who2 
--using cursor to kill all processes 
Declare cur_KillAllProcesses CURSOR FAST_FORWARD FOR 
Select 
SPID 
From @Table 
WHERE [email protected] 
OPEN cur_KillAllProcesses 

FETCH NEXT FROM cur_KillAllProcesses INTO 
@SPID 

WHILE @@FETCH_STATUS=0 
BEGIN 

--add kill process command 

Exec('KILL '+ @SPID) 


FETCH NEXT FROM cur_KillAllProcesses INTO @SPID 

END 

CLOSE cur_KillAllProcesses 
DEALLOCATE cur_KillAllProcesses 
+0

這是殺死進程的合理方式,謝謝 –