由于当前正在使用,无法删除数据库

我想删除一个数据库。 我已经使用了下面的代码,但无济于事。

public void DropDataBase(string DBName,SqlConnection scon) { try { SqlConnection.ClearAllPools(); SqlCommand cmd = new SqlCommand("ALTER DATABASE " + DBName + " SET SINGLE_USER WITH ROLLBACK IMMEDIATE", scon); cmd.CommandType = CommandType.Text; scon.Open(); cmd.ExecuteNonQuery(); scon.Close(); SqlCommand cmddrpdb = new SqlCommand("drop database " + DBName + "", scon); cmddrpdb.CommandType = CommandType.Text; scon.Open(); cmddrpdb.ExecuteNonQuery(); scon.Close(); } catch (Exception ex) { MessageBox.Show("DropDataBase : " +ex.Message); } } 

我越来越错误, 因为它目前正在使用不能删除数据库 。 请帮我解决上述问题。

有人连接到数据库。 尝试切换到另一个数据库,然后放下它:

尝试

SP_WHO看谁连接

KILL如果需要的话

在删除数据库之前,首先删除与该数据库的连接。

我在http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspxfind了解决scheme

 DECLARE @DatabaseName nvarchar(50) SET @DatabaseName = N'YOUR_DABASE_NAME' 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) 

对于SQL服务器pipe理。 工作室:

右键单击数据库:属性 – >选项 – >限制访问:设置为“单用户”,然后执行删除操作

这为时已晚,但对未来的用户可能有用。

在删除数据库查询之前,您可以使用下面的查询:

  alter database [MyDatbase] set single_user with rollback immediate drop database [MyDatabase] 

它会工作。 你也可以参考

如何在sql脚本中指定“closures现有连接”

我希望它会帮助你:)

 select * from sys.sysprocesses where dbid = DB_ID('Test') 

(用你试图删除的数据库的名字replace'Test')这将告诉你哪些进程正在使用它。

如果你还想强迫下降,最终的办法是:

 USE master; GO ALTER DATABASE Test SET SINGLE_USER WITH ROLLBACK IMMEDIATE; GO DROP DATABASE Test; 

希望这可以帮助 !

在SQL Server Management Studio 2016中,执行以下操作:

  • 右键点击数据库

  • 点击删除

  • 检查closures现有的连接

  • 执行删除操作

如果您在SQL Management Studio中删除数据库并收到消息,请不要忘记将Master用作所选数据库,否则您的查询也是与数据库的连接。

 USE Master; GO DROP DATABASE AdventureWorks; GO 

蛮力的解决方法可能是:

  1. 停止SQL Server服务。

  2. 删除相应的.mdf和.ldf文件。

  3. 启动SQL Server服务。

  4. 连接SSMS并删除数据库。

只是想给一个VB.NET(如果想与C语言转换..)我有一个类似的问题,我的程序卸载,删除数据库有点棘手,是的可以让用户进入服务器放下它使用快递,但多数民众赞成在不干净,几个周围后,得到了一个完美的一点点的代码…

  Sub DropMyDatabase() Dim Your_DB_To_Drop_Name As String = "YourDB" Dim Your_Connection_String_Here As String = "SERVER=MyServer;Integrated Security=True" Dim Conn As SqlConnection = New SqlConnection(Your_Connection_String_Here) Dim AlterStr As String = "ALTER DATABASE " & Your_DB_To_Drop_Name & " SET OFFLINE WITH ROLLBACK IMMEDIATE" Dim AlterCmd = New SqlCommand(AlterStr, Conn) Dim DropStr As String = "DROP DATABASE " & Your_DB_To_Drop_Name Dim DropCmd = New SqlCommand(DropStr, Conn) Try Conn.Open() AlterCmd.ExecuteNonQuery() DropCmd.ExecuteNonQuery() Conn.Close() Catch ex As Exception If (Conn.State = ConnectionState.Open) Then Conn.Close() End If MsgBox("Failed... Sorry!" & vbCrLf & vbCrLf & ex.Message) End Try End Sub 

希望这有助于任何看xChickenx的人

更新这里使用这个转换器是C#版本:

 public void DropMyDatabase() { var Your_DB_To_Drop_Name = "YourDB"; var Your_Connection_String_Here = "SERVER=MyServer;Integrated Security=True"; var Conn = new SqlConnection(Your_Connection_String_Here); var AlterStr = "ALTER DATABASE " + Your_DB_To_Drop_Name + " SET OFFLINE WITH ROLLBACK IMMEDIATE"; var AlterCmd = new SqlCommand(AlterStr, Conn); var DropStr = "DROP DATABASE " + Your_DB_To_Drop_Name; var DropCmd = new SqlCommand(DropStr, Conn); try { Conn.Open(); AlterCmd.ExecuteNonQuery(); DropCmd.ExecuteNonQuery(); Conn.Close(); } catch(Exception ex) { if((Conn.State == ConnectionState.Open)) { Conn.Close(); } Trace.WriteLine("Failed... Sorry!" + Environment.NewLine + ex.Message); } } 

您不能删除当前正在使用的数据库,但是如果要从服务器删除数据库而不删除数据库文件,则可以使用sp_detach_db存储过程。

只是重命名数据库(待删除)为我做了诡计。 它不pipe进入数据库的过程如何,所以我可以删除数据库。

使用MS SQL Server 2008,在closures连接选项的DELETE对话框中,这是生成的脚本,我猜这是最好的:

 EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'YOUR_DATABASE_NAME' GO USE [master] GO ALTER DATABASE [YOUR_DATABASE_NAME] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO USE [master] GO /****** Object: Database [YOUR_DATABASE_NAME] Script Date: 01/08/2014 21:36:29 ******/ DROP DATABASE [YOUR_DATABASE_NAME] GO 

我想大声说出我使用了一个来自下面两个答案的脚本。

道具@Hitesh Mistry和@unruledboy

 DECLARE @DatabaseName nvarchar(50) SET @DatabaseName = N'[[[DatabaseName]]]' DECLARE @SQL varchar(max) SELECT @SQL = COALESCE(@SQL,'') + 'Kill ' + Convert(varchar, SPId) + ';' FROM MASTER..SysProcesses WHERE DBId = DB_ID(@DatabaseName) AND SPId <> @@SPId EXEC(@SQL) alter database [[[DatabaseName]]] set single_user with rollback immediate DROP DATABASE [[[DatabaseName]]] 

转到可用的数据库部分,并select主。 然后尝试DROP DATABASE the_DB_name。

首先让你的数据库脱机后脱离它,例如

 Use Master GO ALTER DATABASE dbname SET OFFLINE GO EXEC sp_detach_db 'dbname', 'true'