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

我正在 SQLServer2008中对我的模式进行积极的开发,并且经常想要重新运行我的 drop/create 数据库脚本。当我跑的时候

USE [master]
GO


IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'MyDatabase')
DROP DATABASE [MyDatabase]
GO

我经常得到这个错误

Msg 3702, Level 16, State 4, Line 3
Cannot drop database "MyDatabase" because it is currently in use.

如果在对象资源管理器窗格中右键单击数据库并从上下文菜单中选择“删除”任务,则会出现一个复选框,用于“关闭现有连接”

有没有办法在我的脚本中指定这个选项?

123915 次浏览

您可以断开所有人的连接并回滚他们的事务:

alter database [MyDatbase] set single_user with rollback immediate

之后,可以安全地删除数据库:)

去管理工作室,做你所描述的一切,只是不点击确定,点击脚本。它将显示它将运行的代码,然后您可以将这些代码合并到您的脚本中。

在这种情况下,您需要:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

根据 更改数据库设置文档,在将数据库设置为 SINGLE _ USER 模式后,仍有可能无法访问该数据库:

在将数据库设置为 SINGLE _ USER 之前,请验证 AUTO _ UPDATE _ STATISTICS _ ASYNC 选项设置为 OFF。当设置为 ON 时,用于更新统计信息的后台线程接受与数据库的连接,您将无法以单用户模式访问数据库。

因此,删除具有现有连接的数据库的完整脚本可能如下所示:

DECLARE @dbId int
DECLARE @isStatAsyncOn bit
DECLARE @jobId int
DECLARE @sqlString nvarchar(500)


SELECT @dbId = database_id,
@isStatAsyncOn = is_auto_update_stats_async_on
FROM sys.databases
WHERE name = 'db_name'


IF @isStatAsyncOn = 1
BEGIN
ALTER DATABASE [db_name] SET  AUTO_UPDATE_STATISTICS_ASYNC OFF


-- kill running jobs
DECLARE jobsCursor CURSOR FOR
SELECT job_id
FROM sys.dm_exec_background_job_queue
WHERE database_id = @dbId


OPEN jobsCursor


FETCH NEXT FROM jobsCursor INTO @jobId
WHILE @@FETCH_STATUS = 0
BEGIN
set @sqlString = 'KILL STATS JOB ' + STR(@jobId)
EXECUTE sp_executesql @sqlString
FETCH NEXT FROM jobsCursor INTO @jobId
END


CLOSE jobsCursor
DEALLOCATE jobsCursor
END


ALTER DATABASE [db_name] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE


DROP DATABASE [db_name]

我在 SQLServer2012上试过 hgmnz 说的话。

管理层为我创造了:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'MyDataBase'
GO
USE [master]
GO
/****** Object:  Database [MyDataBase]    Script Date: 09/09/2014 15:58:46 ******/
DROP DATABASE [MyDataBase]
GO

我知道这是为时已晚,但可能是它的帮助有些人。在使用这使您的数据库脱机

ALTER DATABASE dbname SET OFFLINE

尝试这个 C # 代码删除您的数据库

Public static void DropDatabase (字符串数据库) {

        string sql =  "ALTER DATABASE "  + dataBase + "SET SINGLE_USER WITH ROLLBACK IMMEDIATE" ;


using (System.Data.SqlClient.SqlConnection connection = new System.Data.SqlClient.SqlConnection(ConfigurationManager.ConnectionStrings["DBRestore"].ConnectionString))
{
connection.Open();
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.CommandTimeout = 7200;
command.ExecuteNonQuery();
}
sql = "DROP DATABASE " + dataBase;
using (System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand(sql, connection))
{
command.CommandType = CommandType.Text;
command.CommandTimeout = 7200;
command.ExecuteNonQuery();
}
}
}

如果要从应用程序中删除它,则连接字符串的初始目录必须是“ master”

请看下面。不要点击确定,但是 Ctrl + Shift + N,一个带脚本的新窗口将为您准备好。

Drop Database Dialog for script generation