0

现在,我在这里尝试的是根据任何条件(在 IF 块内)从我的 SQL Server 中删除数据库,例如。如果数据库存在,请删除并重新创建它。

我正在使用以下代码:

IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice')
BEGIN
    USE master
    DROP DATABASE practice
END

此代码继续执行几分钟,然后回复错误说

消息 3702,级别 16,状态 4,第 1 行
无法删除数据库“练习”,因为它当前正在使用中。

然后我再次尝试在我的代码中使用 GO 语句来分隔执行流程,并使用以下代码(注意这也有 create database 语句):

IF EXISTS (SELECT 1 FROM sys.databases db with(nolock) WHERE db.name = 'practice')
BEGIN
    USE master
    GO

    DROP DATABASE practice
    GO

    CREATE DATABASE practice
END

现在它抛出这个错误:

消息 102,级别 15,状态 1,第 3 行
'master' 附近的语法不正确。
消息 3702,级别 16,状态 4,第 1 行
无法删除数据库“练习”,因为它当前正在使用中。
消息 102,级别 15,状态 1,第 2 行
'END' 附近的语法不正确

我不知道我是否遗漏了什么,或者是否有任何解决方法需要完成。

此外,如果有的话,我会对更好的替代品感兴趣。

我不知道这是否可行。

问候, 香克斯

4

3 回答 3

0

你也可以做一个

sp_who2 

查看谁或什么连接到该数据库。然后,您可以使用

KILL SPID# (i.e. "KILL 54") 

强制关闭该连接。如果您在生产中,这很危险,但如果您无论如何都要删除并重新创建数据库......

这比@TheGameiswar 所建议的更具外科手术性,但非常相似。

于 2016-05-05T00:40:08.167 回答
0

出于实践的目的,可以使用以下代码:

EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'practice'
GO
USE [master]
GO
ALTER DATABASE [practice] SET  SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DROP DATABASE [practice]
GO

现在你可以创建你的新数据库了。

于 2016-05-05T01:11:53.230 回答
0

如错误消息所示,数据库正在使用中。您可以使用以下脚本强制删除数据库

 if exists(select * from sys.sysdatabases where name ='test')
    begin
    use master;

    alter database test
    set single_user with rollback immediate;

    drop database test;

    end
于 2016-03-19T10:35:57.730 回答