首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 強制中斷資料庫連線的 T-SQL 腳本與批次檔整合

     編輯:關於SqlServer

執行建庫腳本前須先刪除既有資料庫,但 SQL Server 偵測到作用中連線時會阻擋 DROP DATABASE。本文提供可直接嵌入建庫批次檔的 T-SQL 腳本,利用游標逐一 KILL 指定資料庫的所有 SPID,實現強制斷線。

核心 T-SQL 腳本

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;

整合至建庫批次檔(.bat/.cmd)

:: 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 = 密碼

進階建議(SQL Server 2012+)

新版本建議改用 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 角色權限。
  • 強制中斷會導致未認可交易回滾,可能造成用戶端錯誤,請在維護窗口執行。
  • 批次檔中密碼以明文傳遞有安全風險,生產環境建議使用 Windows 驗證(-E)或 SQLCMD 模式搭配加密儲存。
  • osql 已淘汰,建議改用 sqlcmd。

將此腳本置於建庫腳本最前端,即可避免「資料庫正在使用中」導致的部署失敗,實現全自動化部署流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved