執行建庫腳本前須先刪除既有資料庫,但 SQL Server 偵測到作用中連線時會阻擋 DROP DATABASE。本文提供可直接嵌入建庫批次檔的 T-SQL 腳本,利用游標逐一 KILL 指定資料庫的所有 SPID,實現強制斷線。
DECLARE @spid INT;
DECLARE cur CURSOR FOR
SELECT spid FROM sys.sysprocesses
WHERE DB_NAME(dbid) = N'Your_Database_Name'; -- 替換為目標資料庫名稱
OPEN cur;
FETCH NEXT FROM cur INTO @spid;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ('KILL ' + CAST(@spid AS VARCHAR(10)));
FETCH NEXT FROM cur INTO @spid;
END
CLOSE cur;
DEALLOCATE cur;
:: Disconnect existing database connections
osql -S "%1" -U "%2" -P "%3" -Q "DECLARE @spid INT; DECLARE cur CURSOR FOR SELECT spid FROM sys.sysprocesses WHERE DB_NAME(dbid) = 'Your_Database_Name' OPEN cur FETCH NEXT FROM cur INTO @spid WHILE @@FETCH_STATUS = 0 BEGIN EXEC ('KILL ' + CAST(@spid AS VARCHAR(10))) FETCH NEXT FROM cur INTO @spid END CLOSE cur DEALLOCATE cur"
參數說明:
%1 = 伺服器名稱/執行個體
%2 = 登入帳號
%3 = 密碼
新版本建議改用 sys.dm_exec_sessions 並搭配 ALTER DATABASE ... SET SINGLE_USER WITH ROLLBACK IMMEDIATE,語法更簡潔且官方支援:
ALTER DATABASE [Your_Database_Name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
-- 執行 DROP / CREATE 等作業
ALTER DATABASE [Your_Database_Name] SET MULTI_USER;
KILL 需 sysadmin 或 processadmin 角色權限。-E)或 SQLCMD 模式搭配加密儲存。osql 已淘汰,建議改用 sqlcmd。將此腳本置於建庫腳本最前端,即可避免「資料庫正在使用中」導致的部署失敗,實現全自動化部署流程。