SQL Server database administrators may frequently need in especially development and test environments  instead of the production environments to kill all the open connections to a  specific database in order to process SQL Server maintenance task over the SQL Server database.

In such situations when you need to kill or close all the active or open  connections to the SQL Server database, you may manage this task by using the  Microsoft SQL Server Management Studio or by running t-sql commands or codes. Actually, this task can be thought as a batch task to kill sql process running on a SQL Server.

If you open the SQL Server Management Studio and connect to a SQL Server  instance you will see the Activity Monitor object in the Object Explorer screen  of the related database instance. You can double click the Activity Monitor  object or right click to view the context menu and then select a desired item to  display the activities to be monitored on the Activity Monitor screen.

As seen on below you can monitor and view process id's and process details on  the list of prcesses running on the database instance. If you want you can  filter processes based on specific values like user, database or status.

Note that default view when displayed the screen is first opened is filtered  only for non-system processes which means system processes which own the first  50 reserved processid's are not listed in the view by default. You can view  system processes by removing the filter on "Show System Processes" criteria in  the filter settings screen.

SQL Server 2005 SQL Server Management Studio Activity Monitor screen

You can kill a process by a right click on the process in the grid and  selecting the Kill Process menu item. You will be asked for a confirmation to  kill the related process and then will kill the open connection to the database  over this process. This action is just like running to kill sql process t-sql command for a single process.

A second method which I do not recommend but can be used in some situations  may be using the Detach Database screen to drop connections and detaching the  database and then re-attaching the database. You can open the Detach Database  screen from the context menu displayed by a right click on the related daabase  for example for the below screen shot the name of the database is Works. On the  menu, highlight menu item Tasks then select the Detach... menu item. This  selection will open the detach database dialog screen. Note that if in the  message column it is declared that active connections exists as for our case the  number of active connections is 2, you will not be able to detach the database  unless the Drop Connections checkbox is also selected.

The above configuration as the Drop Connections check box is cleared and  active connections exist, the detach task will fail:

Detach database failed for Server '{DatabaseInstanceName}'. (Microsoft.SqlServer.Smo)
For help, click: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server& ProdVer=9.00.2047.00& EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates. FailedOperationExceptionText& EvtID=Detach+database+Server& LinkId=20476
An exception occurred while executing a Transact-SQL statement or batch.  (Microsoft.SqlServer.ConnectionInfo)
Cannot detach the database '{DatabaseName}' because it is currently in use.  (Microsoft SQL Server, Error: 3703)

But if the Drop Connections is selected you can successfully detach the  database. Then you will have to re-attach the database by selecting the Attach  command from the context menu item displayed on the Databases node of the SQL  Server instance.

For SQL Server 2000 the default behaviour was different than the SQL Server  2005. Because in SQL Server 2000, when you run the detach command from the menu  item, you are prompted if you want to drop all active connections. Then you can  confirm closing of all open connections, but the nice thing is that you can  cancel detach process after the open connections are dropped or closed. But for  SQL Server 2005, this behaviour is not valid.

How to Kill All Processes using T-SQL Code

By using t-sql commands or sql codes, similarly closing connections can be implemented by a few methods. One of the methods is using a cursor which loops for all the active connections of the related database and kill these processes.  This method was also mention on SQL Server article named How to Alter a SQL Server Database as Single User Mode and as Multi User Mode

The below code block can be used to kill all processes which are connected to the sql database named @DatabaseName except the process that the code block is running in the scope of. You can also set the SQL Server database name by the DB_NAME() property.

The base of the below t-sql script is sql Kill SPId command. Within the sql cursor which loops through each process in sysProcesses view, each time a tsql Kill process command is called passing the SPId as an argument. And after Kill SPId sql statement is executed for each process, all database connections are dropped.

SQL Server database administrators can use below t-sql script in order to drop connections SQL Server 2008, or SQL Server 2005 and also drop connections to sql server 2000 database.

DECLARE @DatabaseName nvarchar(50) DECLARE @SPId int DECLARE @SQL nvarchar(100)
--SET @DatabaseName = N'AdventureWorks2008' SET @DatabaseName = DB_NAME() DECLARE my_cursor CURSOR FAST_FORWARD FOR SELECT SPId FROM MASTER..SysProcesses WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @SPId
WHILE @@FETCH_STATUS = 0 BEGIN  SET @SQL = 'KILL ' + CAST(@SPId as nvarchar(10))  print @SQL  EXEC sp_executeSQL @SQL  --KILL @SPId -- Causing Incorrect syntax near '@spid'.
 FETCH NEXT FROM my_cursor INTO @SPId END
CLOSE my_cursor DEALLOCATE my_cursor

UPDATE : Please note that I altered above t-sql script and removed KILL @SPId sql statement. It was causing the below error. Msg 102, Level 15, State 1, Line 19 Incorrect syntax near '@SPId'. This is because the sql processid can not be used using a variable with sql KILL command. The solution is using dynamic t-sql statement as shown in the above sql cursor code.

A second way to drop all active connections of a database can be implemented by generating dynamic sql commands that runs a list of "Kill @spId" commands.

DECLARE @DatabaseName nvarchar(50) SET @DatabaseName = N'Works' --SET @DatabaseName = DB_NAME()
DECLARE @SQL varchar(max) SET @SQL = ''
SELECT @SQL = @SQL + 'Kill ' + Convert(varchar, SPId) + ';' FROM MASTER..SysProcesses WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
-- SELECT @SQL EXEC(@SQL)

A very similar to the sql code above, an other code block can be used by using the COALESCE as shown below

DECLARE @DatabaseName nvarchar(50) SET @DatabaseName = N'Works'
DECLARE @SQL varchar(max)
SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';' FROM MASTER..SysProcesses WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId
--SELECT @SQL EXEC(@SQL)

The above sql queries can be modified further for specific needs. For example you may create a sql stored procedure that drops all existing active connections. You may pass SQL database name or database id as parameter or use the current database information to kill processes except its own process, etc.

How to Kill All Processes That Have Open Connection in a SQL Server Database[关闭数据库链接 最佳方法] -摘自网络的更多相关文章

  1. (转)How To Kill runaway processes After Terminating Concurrent Request

    终止EBS并发请求后,解锁相关的进程. 还有种方法可以在PLSQL->tools->session 中找到并且kill Every concurrent Request uses some ...

  2. SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析

    今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过程,里面使用了链接服务器(Linked Server)查询另外一台服务器数据(存储过程里面没有任何显性事务.UPDATE. ...

  3. sql server block如何查询并kill

    本帖提供两种做法,可避免在 SQL Server 事务锁定时产生的不正常或长时间阻塞,让用户和程序也无限期等待,甚至引起 connection pooling 连接数超过容量. 所谓的「阻塞」,是指当 ...

  4. SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析[转]

    本文将为您描述SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析,教程操作方法: 今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过 ...

  5. sql server 查看表的死锁和Kill 死锁进程

    查询出来 select        request_session_id spid,       OBJECT_NAME(resource_associated_entity_id) tableNa ...

  6. sql server 查询和Kill死锁进程

    查询死锁进程语句 select        request_session_id spid,       OBJECT_NAME(resource_associated_entity_id) tab ...

  7. SQL Server查询死锁并KILL

    杀掉死锁的sqlserver进程   SELECT request_session_id spid,OBJECT_NAME (resource_associated_entity_id)tableNa ...

  8. Sql server 查看锁和Kill 死锁进程

    死锁的概念 死锁就是两个或多个会话(SPID)相互请求对方持有的锁资源,导致循环等待的情况.下面两种方法都是用来粗暴的解决死锁的. # 已知阻塞进程ID KILL ID SELECT blocking ...

  9. SHUTDOWN: Active processes prevent shutdown operation

    在使用shutdown immediate关闭数据库时hang住,查看alert 日志,遭遇了SHUTDOWN: Active processes prevent shutdown operation ...

随机推荐

  1. vi/vim正则表达式

    http://www.cnblogs.com/penseur/archive/2011/02/25/1964522.html 毋庸多言,在vim中正则表达式得到了十分广泛的应用. 最常用的 / 和 : ...

  2. 2014年度辛星css教程夏季版第一节

    CSS是Cascading Style Sheets的缩写,即层叠样式表,它用于表现HTML的样式,即HTML只是去写该网页有哪些内容,至于如何去表现它们,由CSS去定制. ************* ...

  3. 关于Mysql数据库longblob格式数据的插入com.mysql.jdbc.PreparedStatement.setBinaryStream(ILjava/io/InputStream;J)V问题分析

    当数据库字段为blob类型时 ,我们如果使用PreparedStatement中的setBinaryStream(int,InputStream,int)方法需要注意 在向blob字段类型中插入数据时 ...

  4. <二> SQL 基础

    left (outer) join 结果集包含连接表的匹配行,也包括左连接表的所有行. select a.a, a.b, a.c, b.c b.d b.f from a left out join b ...

  5. 一个简单的php分页类代码(转载)

    入门级php分页类 原文地址:http://www.xfcodes.com/php/fenye/3608.htm 时间:2015-12-16 20:52:00来源:网络 php分页类. 复制代码代码如 ...

  6. secondarynamenode异常

    secondarynamenode异常 -- ::, ERROR org.apache.hadoop.hdfs.server.namenode.SecondaryNameNode: Exception ...

  7. boost 编译

    备份一下,用的时候直接粘贴,免得到处找>_< 32 bjam threading=multi link=static runtime-link=static --stagedir=stag ...

  8. 【win8技巧】应用商店里面如何搜索应用app

    win8应用商店搜索app软件的技巧 1.组合键 WIN+C 打开屏幕最右边磁条 2.点击搜索,输入你想搜的软件名称,里面会列出你已经安装的app或者你点击下面的应用商店选项,就可以搜索互联网上应用商 ...

  9. 关于SQL语句中SUM函数返回NULL的解决办法

    SUM 是SQL语句中的标准求和函数,如果没有符合条件的记录,那么SUM函数会返回NULL. 但多数情况下,我们希望如果没有符合条件记录的情况下,我们希望它返回0,而不是NULL,那么我们可以使用例如 ...

  10. java super 隐式参数

    第41集 所有构造器里,第一句话就是super()           (隐式的,系统自动执行) 鸟构造器调用动物构造器,动物构造器调用object构造器. (系统默认的) tostring() 方法 ...