2014-03-24 54 views
1

在SQL Server 2012中,当我发表声明ALTER DATABASE [...] WITH NO_WAIT SET SINGLE_USER等待20秒

ALTER DATABASE [...] SET SINGLE_USER WITH NO_WAIT 

和其他人正在使用的数据库,我要等待大约20秒直到请求失败,尽管有NO_WAIT终止子句。

是否可以告诉SQL Server立即让“ALTER DATABASE”请求失败?最好还适用于旧版本的SQL Server? (尽管在SQL Server 2005和更早版本中似乎不支持“ALTER DATABASE SET”)。

+0

只是为了确保我的理解......你希望ALTER DATABASE语句失败,如果在db上有打开的事务,对吧? (否则,你应该使用'WITH ROLLBACK IMMEDIATE'。) – DMason

+0

@DMason是的,这是正确的,我想ALTER DATABASE失败。 – herzbube

+0

我不知道内置的方式来解决20秒的延迟时间。也许你可以在运行'ALTER DATABASE ...' – DMason

回答

1

试试看。在尝试将其置于SINGLE_USER模式之前,它会检查数据库的活动连接。

use master 
GO 

DECLARE @DBName SYSNAME = N'YourDbName' 

IF NOT EXISTS (
    SELECT sd.Name, sp.* 
    FROM sys.sysprocesses sp 
    JOIN sys.sysdatabases sd 
     ON sd.dbid = sp.dbid 
    WHERE sd.Name = @DBName 
    AND sp.spid <> @@SPID 
) 
BEGIN 
    ALTER DATABASE [...] 
    SET SINGLE_USER WITH NO_WAIT 
END 
+0

这可能是一个开始。但是:如果我自己的连接是数据库上唯一活动的连接,则'ALTER DATABASE'有效。在你的建议中,'SELECT'查询将返回一行,因此'ALTER DATABASE'语句永远不会被发布。是否可以改进'SELECT'以便排除我自己的连接? – herzbube

+0

你是对的。它应该从不同的数据库运行。我已经用顶部的'user master'语句编辑了答案。 – DMason

+0

此外,这将排除您的连接:'AND sp.spid <> @@ SPID' – DMason