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

我在SQL Server 2008中的架构上进行了积极的开发,并且经常要重新运行我的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. 

如果右键单击对象浏览器窗格中的数据库并从上下文菜单中select删除任务,则会出现一个checkbox,用于“closures现有连接”

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

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

 alter database [MyDatbase] set single_user with rollback immediate 

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

去pipe理工作室,并做你所描述的一切,而不是点击确定,点击脚本。 它将显示它将运行的代码,然后将其合并到脚本中。

在这种情况下,你想要:

 ALTER DATABASE [MyDatabase] SET SINGLE_USER WITH ROLLBACK IMMEDIATE GO 

根据ALTER DATABASE SET文档,在将数据库设置为SINGLE_USER模式后,仍然有可能无法访问该数据库:

在将数据库设置为SINGLE_USER之前,请确认AUTO_UPDATE_STATISTICS_ASYNC选项已设置为OFF。 设置为ON时,用于更新统计信息的后台线程将与数据库build立连接,并且将无法以单用户模式访问数据库。

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

 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] 

我尝试了SQL Server 2012上的什么说法。

pipe理创造给我:

 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