有没有办法可以终止 ms sql server 中的一系列会话 ID(连接)?

有没有办法可以终止 ms sql server 中的一系列会话 ID(连接)?

我想知道是否有办法终止 Microsoft SQL DB 上的一系列 SQL 连接。

如果我想终止单个会话 ID,我可以使用kill [session-id]; go;

如果我想终止所有会话,我可以使用以下命令切换数据库模式ALTER DATABASE [DB-NAME] SET SINGLE_USER WITHROLLBACK IMMEDIATE

但是,如果我想终止会话 ID 范围为 60-100 的会话,或者来自特定主机名或特定用户名的所有会话,该怎么办?有没有简单的方法?我没有找到使用“kill”命令的解决方案。有什么想法吗?

答案1

我实际上不会亲自执行此操作。;)然而。

Declare @procid int,
        @SQL nvarchar(max)


SET @procid=60
WHILE @procid < 100
BEGIN
    set @SQL='kill ' + CONVERT(nvarchar,@procid)
    EXEC SP_EXECUTESQL @SQL
    SET @procid=@procid+1
END

对于来自特定主机名或用户名的进程:

DECLARE @Table TABLE(
        SPID INT,
        Status VARCHAR(MAX),
        LOGIN VARCHAR(MAX),
        HostName VARCHAR(MAX),
        BlkBy VARCHAR(MAX),
        DBName VARCHAR(MAX),
        Command VARCHAR(MAX),
        CPUTime INT,
        DiskIO INT,
        LastBatch VARCHAR(MAX),
        ProgramName VARCHAR(MAX),
        SPID_1 INT,
        REQUESTID INT
)

Declare @SQL nvarchar(max),
        @spid int

INSERT INTO @Table EXEC sp_who2

SELECT  @spid = min(SPID) FROM @Table WHERE HostName/Login = 'Whatever'

while @spid is not null

BEGIN
    set @SQL='kill ' + convert(nvarchar,@spid)
    EXEC SP_EXECUTESQL @SQL
    SELECT  @spid = min(SPID) FROM @Table WHERE HostName/Login = 'Whatever' and spid > @spid            
END

(显然,您事先已经准备好了这些脚本。)

相关内容