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

如何在sql脚本中指定“关闭现有连接”,sql,sql-server,Sql,Sql Server,我正在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 "M

我正在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.
如果在“对象资源管理器”窗格中右键单击数据库并从关联菜单中选择“删除”任务,则会出现一个复选框,用于关闭现有连接


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

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

alter database [MyDatbase] set single_user with rollback immediate

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

转到ManagementStudio并执行您描述的所有操作,只需单击脚本而不是单击“确定”。它将显示它将运行的代码,然后您可以将这些代码合并到脚本中

在这种情况下,您需要:

ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
根据文档,将数据库设置为单用户模式后,仍有可能无法访问该数据库:

在将数据库设置为单用户之前,请验证AUTO\u UPDATE\u STATISTICS\u 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]

我尝试了hgmnz在SQL Server 2012上所说的话

为我创建的管理:

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代码删除数据库

公共静态void dropdatabases字符串数据库 {

        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();
            }
        }
    }

我将尝试通过完全按照您描述的方式编写“删除数据库”对话框脚本来回答此问题,但如果您选中“关闭现有连接”复选框,则不会将ALTER database行添加到脚本中。向导生成的脚本为我包括“ALTER database”行。奇怪。哪个Management Studio版本?我是在2008年x64上。我也是:Microsoft SQL Server Management Studio 10.0.1600.22操作系统6.0.6001在未将ALTER DATABASE添加到脚本中时遇到相同的问题。为了将其添加到脚本中,我必须确保在生成脚本时,有一个进程正在对该数据库运行活动连接。我使用了此选项,但ften想知道是否有机会让另一个用户以单个用户的身份进入—这可能吗?可能的替代方案是ALTER DATABASE[MyDatabaseName]使用立即回滚设置脱机单用户模式下的用户就是您;除非您在设置单用户模式后断开连接。然后其他一个用户可以登录。一旦您删除了数据库,如果您创建了一个同名的新数据库,我想它将处于多用户模式?因此您不必运行:alter database[MyDatbase]多集_user@AndyM:是的,多用户可能是default@Kristen使用您的方法,我发现sql server没有删除mdf和ldf文件。Set single_user对我来说很好,我需要不断重新创建数据库。这不会关闭活动连接。请确保选中了“关闭现有连接”;如果不选中,请立即回滚语句。sp_delete_database_backuphistory来自检查数据库的删除备份和还原历史信息。检查关闭现有连接不会生成ALTER database SET SINGLE_USER…如果当前没有要关闭的连接。备注:删除脱机数据库后,文件Mdf不会被删除!