我想删除一个数据库。我使用了以下代码,但无济于事。
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);
}
}
我收到错误,因为无法删除数据库,因为它当前正在使用。 请帮助我解决上述问题。
答案 0 :(得分:93)
我在http://www.kodyaz.com/articles/kill-all-processes-of-a-database.aspx
找到了解决方案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)
答案 1 :(得分:39)
有人连接到数据库。尝试切换到另一个数据库,然后删除它:
尝试
SP_WHO
看看谁联系了
和KILL
答案 2 :(得分:33)
对于SQL server mgmt。工作室:
右键单击数据库:属性 - &gt;选项 - &gt;限制访问:设置为“单个用户”并在之后执行删除
答案 3 :(得分:30)
现在为时已晚,但对未来的用户可能会有用。
您可以在删除数据库查询之前使用以下查询:
alter database [MyDatbase] set single_user with rollback immediate
drop database [MyDatabase]
它会起作用。你也可以参考
How do I specify "close existing connections" in sql script
我希望它会对你有所帮助:)。
答案 4 :(得分:17)
在SQL Server Management Studio 2016中,执行以下操作:
右键单击数据库
点击删除
检查关闭现有连接
执行删除操作
答案 5 :(得分:12)
select * from sys.sysprocesses where dbid = DB_ID('Test')
(替换&#39;测试&#39;以及您要删除的数据库的名称) 这将告诉您哪些进程正在使用它。
如果你还想强行放弃,那么最终的方法是:
USE master;
GO
ALTER DATABASE Test
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
GO
DROP DATABASE Test;
希望这有帮助!
答案 6 :(得分:4)
如果您在SQL Management Studio中删除数据库并收到消息,请不要忘记您使用Master作为选定数据库,否则您的查询也是与数据库的连接。
USE Master;
GO
DROP DATABASE AdventureWorks;
GO
答案 7 :(得分:3)
首先将数据库脱离,然后将其分离,例如
Use Master
GO
ALTER DATABASE dbname SET OFFLINE
GO
EXEC sp_detach_db 'dbname', 'true'
答案 8 :(得分:2)
强力解决方法可能是:
停止SQL Server服务。
删除相应的.mdf和.ldf文件。
启动SQL Server服务。
与SSMS连接并删除数据库。
答案 9 :(得分:1)
只是想给一个vb.net(如果想要转换的话就像c语言一样..)我有一个类似的问题,卸载我的一个程序,删除数据库有点棘手,是的可以让用户进入服务器使用Express删除它,但那不干净,经过几次环顾四周得到了完美的一点代码......
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
<强>更新强> 在这里使用this转换器是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);
}
}
答案 10 :(得分:1)
首先检查连接的数据库
SP_WHO
第二次断开数据库连接
DECLARE @DatabaseName nvarchar(50)
SET @DatabaseName = N'your_database_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)
最终放弃它
drop database your_database
答案 11 :(得分:0)
使用MS SQL Server 2008,在带有关闭连接选项的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
答案 12 :(得分:0)
只是重命名数据库(要删除)对我来说很有用。它取消了访问数据库的任何进程,因此我可以删除数据库。
答案 13 :(得分:0)
我想说我使用的脚本来自以下两个答案。
支持@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]]]
答案 14 :(得分:0)
转到可用数据库部分并选择master。然后尝试DROP DATABASE the_DB_name。
答案 15 :(得分:0)
如果要在不删除数据库文件的情况下从服务器中删除数据库,则不能删除当前正在使用的数据库,但可以使用sp_detach_db
存储过程。
答案 16 :(得分:0)
要删除即使数据库正在运行的数据库,也可以使用此批处理文件
@echo off
set /p dbName= "Enter your database name to drop: "
echo Setting to single-user mode
sqlcmd -Q "ALTER DATABASE [%dbName%] SET SINGLE_USER WITH ROLLBACK IMMEDIATE"
echo Dropping...
sqlcmd -Q "drop database %dbName%"
echo Completed.
pause
答案 17 :(得分:0)
使用这个:
/* Delete Database Backup and Restore History from MSDB System Database */
EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'[dba]'
GO
/* Query to Get Exclusive Access of SQL Server Database before Dropping the Database */
USE [master]
GO
ALTER DATABASE [dba]
SET SINGLE_USER
WITH
ROLLBACK IMMEDIATE
GO
/* Query to Drop Database in SQL Server */
DROP DATABASE [dba]
GO