2012-06-11 76 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

这是杀死进程的合理方式,谢谢 –