資料庫復原/還原/複製操作中斷,導致資料庫卡在 SINGLE_USER 模式 (SSMS 物件總管顯示「單一使用者」),無法建立新連線。需先終止現有佔用連線,再切回 MULTI_USER。
USE master;
GO
-- 1. 宣告動態 SQL 變數
DECLARE @sql NVARCHAR(MAX) = N'';
-- 2. 產生 KILL 指令針對目標資料庫的所有 SPID
-- 注意:sys.sysprocesses 為相容性檢視,新版建議用 sys.dm_exec_sessions
SELECT @sql = @sql + N'; KILL ' + CAST(spid AS NVARCHAR(10))
FROM sys.sysprocesses
WHERE dbid = DB_ID(N'YourDatabaseName'); -- ← 修改為實際資料庫名稱
-- 3. 執行批次 KILL
EXEC sp_executesql @sql;
GO
-- 4. 切換回多用戶模式
ALTER DATABASE [YourDatabaseName] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO
WITH ROLLBACK IMMEDIATE:確保若有殘留交易立即回滾,強制完成模式切換。sys.dm_exec_sessions 現代寫法 (SQL 2005+):SELECT @sql = @sql + N'; KILL ' + CAST(session_id AS NVARCHAR(10))
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID(N'YourDatabaseName')
AND is_user_process = 1;
CREATE PROC dbo.usp_ForceMultiUser @dbname SYSNAME
WITH EXECUTE AS OWNER
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX) = N'';
SELECT @sql = @sql + N'; KILL ' + CAST(session_id AS NVARCHAR(10))
FROM sys.dm_exec_sessions
WHERE database_id = DB_ID(@dbname) AND is_user_process = 1;
IF @sql <> N'' EXEC sp_executesql @sql;
EXEC (N'ALTER DATABASE ' + QUOTENAME(@dbname) + N' SET MULTI_USER WITH ROLLBACK IMMEDIATE');
END;
使用:EXEC usp_ForceMultiUser 'YourDatabaseName';